源站支持客户端证书

This commit is contained in:
刘祥超
2022-01-16 19:51:26 +08:00
parent 021dc13ce9
commit 136f0fd4bd
11 changed files with 106 additions and 5 deletions

View File

@@ -63,6 +63,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
primaryOriginMaps = append(primaryOriginMaps, m) primaryOriginMaps = append(primaryOriginMaps, m)
} }
@@ -77,6 +78,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
backupOriginMaps = append(backupOriginMaps, m) backupOriginMaps = append(backupOriginMaps, m)
} }

View File

@@ -63,6 +63,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
primaryOriginMaps = append(primaryOriginMaps, m) primaryOriginMaps = append(primaryOriginMaps, m)
} }
@@ -77,6 +78,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
backupOriginMaps = append(backupOriginMaps, m) backupOriginMaps = append(backupOriginMaps, m)
} }

View File

@@ -63,6 +63,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
primaryOriginMaps = append(primaryOriginMaps, m) primaryOriginMaps = append(primaryOriginMaps, m)
} }
@@ -77,6 +78,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
backupOriginMaps = append(backupOriginMaps, m) backupOriginMaps = append(backupOriginMaps, m)
} }

View File

@@ -64,6 +64,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
primaryOriginMaps = append(primaryOriginMaps, m) primaryOriginMaps = append(primaryOriginMaps, m)
} }
@@ -78,6 +79,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
backupOriginMaps = append(backupOriginMaps, m) backupOriginMaps = append(backupOriginMaps, m)
} }

View File

@@ -8,6 +8,7 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
"github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/actions"
"net/url" "net/url"
"regexp" "regexp"
@@ -62,6 +63,8 @@ func (this *AddPopupAction) RunPost(params struct {
MaxIdleConns int32 MaxIdleConns int32
IdleTimeout int IdleTimeout int
CertIdsJSON []byte
DomainsJSON []byte DomainsJSON []byte
Description string Description string
@@ -129,6 +132,31 @@ func (this *AddPopupAction) RunPost(params struct {
return return
} }
// 证书
var certIds = []int64{}
if len(params.CertIdsJSON) > 0 {
err = json.Unmarshal(params.CertIdsJSON, &certIds)
if err != nil {
this.ErrorPage(err)
return
}
}
var certRefJSON []byte
if len(certIds) > 0 {
var certId = certIds[0]
if certId > 0 {
var certRef = &sslconfigs.SSLCertRef{
IsOn: true,
CertId: certId,
}
certRefJSON, err = json.Marshal(certRef)
if err != nil {
this.ErrorPage(err)
return
}
}
}
var domains = []string{} var domains = []string{}
if len(params.DomainsJSON) > 0 { if len(params.DomainsJSON) > 0 {
err = json.Unmarshal(params.DomainsJSON, &domains) err = json.Unmarshal(params.DomainsJSON, &domains)
@@ -158,6 +186,7 @@ func (this *AddPopupAction) RunPost(params struct {
IdleTimeoutJSON: idleTimeoutJSON, IdleTimeoutJSON: idleTimeoutJSON,
MaxConns: params.MaxConns, MaxConns: params.MaxConns,
MaxIdleConns: params.MaxIdleConns, MaxIdleConns: params.MaxIdleConns,
CertRefJSON: certRefJSON,
Domains: domains, Domains: domains,
}) })
if err != nil { if err != nil {

View File

@@ -7,6 +7,7 @@ import (
"github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared" "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/shared"
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/sslconfigs"
"github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/actions"
"github.com/iwind/TeaGo/maps" "github.com/iwind/TeaGo/maps"
"github.com/iwind/TeaGo/types" "github.com/iwind/TeaGo/types"
@@ -86,6 +87,12 @@ func (this *UpdatePopupAction) RunGet(params struct {
config.Domains = []string{} config.Domains = []string{}
} }
// 重置数据
if config.Cert != nil {
config.Cert.CertData = nil
config.Cert.KeyData = nil
}
this.Data["origin"] = maps.Map{ this.Data["origin"] = maps.Map{
"id": config.Id, "id": config.Id,
"protocol": config.Addr.Protocol, "protocol": config.Addr.Protocol,
@@ -99,6 +106,7 @@ func (this *UpdatePopupAction) RunGet(params struct {
"idleTimeout": idleTimeout, "idleTimeout": idleTimeout,
"maxConns": config.MaxConns, "maxConns": config.MaxConns,
"maxIdleConns": config.MaxIdleConns, "maxIdleConns": config.MaxIdleConns,
"cert": config.Cert,
"domains": config.Domains, "domains": config.Domains,
} }
@@ -121,6 +129,7 @@ func (this *UpdatePopupAction) RunPost(params struct {
MaxIdleConns int32 MaxIdleConns int32
IdleTimeout int IdleTimeout int
CertIdsJSON []byte
DomainsJSON []byte DomainsJSON []byte
Description string Description string
@@ -188,6 +197,31 @@ func (this *UpdatePopupAction) RunPost(params struct {
return return
} }
// 证书
var certIds = []int64{}
if len(params.CertIdsJSON) > 0 {
err = json.Unmarshal(params.CertIdsJSON, &certIds)
if err != nil {
this.ErrorPage(err)
return
}
}
var certRefJSON []byte
if len(certIds) > 0 {
var certId = certIds[0]
if certId > 0 {
var certRef = &sslconfigs.SSLCertRef{
IsOn: true,
CertId: certId,
}
certRefJSON, err = json.Marshal(certRef)
if err != nil {
this.ErrorPage(err)
return
}
}
}
var domains = []string{} var domains = []string{}
if len(params.DomainsJSON) > 0 { if len(params.DomainsJSON) > 0 {
err = json.Unmarshal(params.DomainsJSON, &domains) err = json.Unmarshal(params.DomainsJSON, &domains)
@@ -218,6 +252,7 @@ func (this *UpdatePopupAction) RunPost(params struct {
IdleTimeoutJSON: idleTimeoutJSON, IdleTimeoutJSON: idleTimeoutJSON,
MaxConns: params.MaxConns, MaxConns: params.MaxConns,
MaxIdleConns: params.MaxIdleConns, MaxIdleConns: params.MaxIdleConns,
CertRefJSON: certRefJSON,
Domains: domains, Domains: domains,
}) })
if err != nil { if err != nil {

View File

@@ -91,6 +91,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
primaryOriginMaps = append(primaryOriginMaps, m) primaryOriginMaps = append(primaryOriginMaps, m)
} }
@@ -105,6 +106,7 @@ func (this *IndexAction) RunGet(params struct {
"name": originConfig.Name, "name": originConfig.Name,
"isOn": originConfig.IsOn, "isOn": originConfig.IsOn,
"domains": originConfig.Domains, "domains": originConfig.Domains,
"hasCert": originConfig.Cert != nil,
} }
backupOriginMaps = append(backupOriginMaps, m) backupOriginMaps = append(backupOriginMaps, m)
} }

View File

@@ -92,6 +92,9 @@ Vue.component("origin-list-table", {
<div v-if="origin.domains != null && origin.domains.length > 0"> <div v-if="origin.domains != null && origin.domains.length > 0">
<grey-label v-for="domain in origin.domains">{{domain}}</grey-label> <grey-label v-for="domain in origin.domains">{{domain}}</grey-label>
</div> </div>
<div v-if="origin.hasCert">
<tiny-basic-label>证书</tiny-basic-label>
</div>
</td> </td>
<td :class="{disabled:!origin.isOn}">{{origin.weight}}</td> <td :class="{disabled:!origin.isOn}">{{origin.weight}}</td>
<td> <td>

View File

@@ -1,18 +1,29 @@
Vue.component("ssl-certs-box", { Vue.component("ssl-certs-box", {
props: [ props: [
"v-certs", // 证书列表 "v-certs", // 证书列表
"v-cert", // 单个证书
"v-protocol", // 协议https|tls "v-protocol", // 协议https|tls
"v-view-size", // 弹窗尺寸 "v-view-size", // 弹窗尺寸normal, mini
"v-single-mode" // 单证书模式 "v-single-mode", // 单证书模式
"v-description" // 描述文字
], ],
data: function () { data: function () {
let certs = this.vCerts let certs = this.vCerts
if (certs == null) { if (certs == null) {
certs = [] certs = []
} }
if (this.vCert != null) {
certs.push(this.vCert)
}
let description = this.vDescription
if (description == null || typeof (description) != "string") {
description = ""
}
return { return {
certs: certs certs: certs,
description: description
} }
}, },
methods: { methods: {
@@ -77,13 +88,14 @@ Vue.component("ssl-certs-box", {
template: `<div> template: `<div>
<input type="hidden" name="certIdsJSON" :value="JSON.stringify(certIds())"/> <input type="hidden" name="certIdsJSON" :value="JSON.stringify(certIds())"/>
<div v-if="certs != null && certs.length > 0"> <div v-if="certs != null && certs.length > 0">
<div class="ui label small" v-for="(cert, index) in certs"> <div class="ui label small basic" v-for="(cert, index) in certs">
{{cert.name}} / {{cert.dnsNames}} / 有效至{{formatTime(cert.timeEndAt)}} &nbsp; <a href="" title="删除" @click.prevent="removeCert(index)"><i class="icon remove"></i></a> {{cert.name}} / {{cert.dnsNames}} / 有效至{{formatTime(cert.timeEndAt)}} &nbsp; <a href="" title="删除" @click.prevent="removeCert(index)"><i class="icon remove"></i></a>
</div> </div>
<div class="ui divider" v-if="buttonsVisible()"></div> <div class="ui divider" v-if="buttonsVisible()"></div>
</div> </div>
<div v-else> <div v-else>
<span class="red">选择或上传证书后<span v-if="vProtocol == 'https'">HTTPS</span><span v-if="vProtocol == 'tls'">TLS</span>服务才能生效。</span> <span class="red" v-if="description.length == 0">选择或上传证书后<span v-if="vProtocol == 'https'">HTTPS</span><span v-if="vProtocol == 'tls'">TLS</span>服务才能生效。</span>
<span class="grey" v-if="description.length > 0">{{description}}</span>
<div class="ui divider" v-if="buttonsVisible()"></div> <div class="ui divider" v-if="buttonsVisible()"></div>
</div> </div>
<div v-if="buttonsVisible()"> <div v-if="buttonsVisible()">

View File

@@ -39,6 +39,12 @@
<td colspan="2"><more-options-indicator></more-options-indicator></td> <td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr> </tr>
<tbody v-show="moreOptionsVisible"> <tbody v-show="moreOptionsVisible">
<tr v-if="protocol == 'https' || protocol == 'tls'">
<td>{{protocol.toUpperCase()}}证书</td>
<td>
<ssl-certs-box :v-single-mode="true" :v-view-size="'mini'" :v-description="'可以选择连接源站使用的证书。'"></ssl-certs-box>
</td>
</tr>
<tr v-if="isHTTP"> <tr v-if="isHTTP">
<td>专属域名</td> <td>专属域名</td>
<td> <td>

View File

@@ -40,6 +40,12 @@
<td colspan="2"><more-options-indicator></more-options-indicator></td> <td colspan="2"><more-options-indicator></more-options-indicator></td>
</tr> </tr>
<tbody v-show="moreOptionsVisible"> <tbody v-show="moreOptionsVisible">
<tr v-if="origin.protocol == 'https' || origin.protocol == 'tls'">
<td>{{origin.protocol.toUpperCase()}}证书</td>
<td>
<ssl-certs-box :v-single-mode="true" :v-cert="origin.cert" :v-view-size="'mini'" :v-description="'可以选择连接源站使用的证书。'"></ssl-certs-box>
</td>
</tr>
<tr v-if="isHTTP"> <tr v-if="isHTTP">
<td>专属域名</td> <td>专属域名</td>
<td> <td>