From aed35990bce9604f489674d322c43531ca5ce954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Sun, 27 Oct 2024 04:17:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=AD=BE=E5=8F=91?= =?UTF-8?q?=E8=87=AA=E7=AD=BE=E5=90=8D=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/biz/cert.go | 1 + internal/data/cert.go | 24 ++++++++++++++++++++++++ internal/route/http.go | 1 + internal/service/cert.go | 15 +++++++++++++++ web/src/api/panel/cert/index.ts | 3 +++ web/src/views/cert/CertView.vue | 2 +- web/src/views/cert/ObtainModal.vue | 19 ++++++++++++++++--- 7 files changed, 61 insertions(+), 4 deletions(-) diff --git a/internal/biz/cert.go b/internal/biz/cert.go index b62ba461..ecf0c1bf 100644 --- a/internal/biz/cert.go +++ b/internal/biz/cert.go @@ -37,6 +37,7 @@ type CertRepo interface { Delete(id uint) error ObtainAuto(id uint) (*acme.Certificate, error) ObtainManual(id uint) (*acme.Certificate, error) + ObtainSelfSigned(id uint) error Renew(id uint) (*acme.Certificate, error) ManualDNS(id uint) ([]acme.DNSRecord, error) Deploy(ID, WebsiteID uint) error diff --git a/internal/data/cert.go b/internal/data/cert.go index 3348bd27..8fdec489 100644 --- a/internal/data/cert.go +++ b/internal/data/cert.go @@ -207,6 +207,30 @@ func (r *certRepo) ObtainManual(id uint) (*acme.Certificate, error) { return &ssl, nil } +func (r *certRepo) ObtainSelfSigned(id uint) error { + cert, err := r.Get(id) + if err != nil { + return err + } + + crt, key, err := pkgcert.GenerateSelfSigned(cert.Domains) + if err != nil { + return err + } + + cert.Cert = string(crt) + cert.Key = string(key) + if err = app.Orm.Save(cert).Error; err != nil { + return err + } + + if cert.Website != nil { + return r.Deploy(cert.ID, cert.WebsiteID) + } + + return nil +} + func (r *certRepo) Renew(id uint) (*acme.Certificate, error) { cert, err := r.Get(id) if err != nil { diff --git a/internal/route/http.go b/internal/route/http.go index 4d94c908..76c0a185 100644 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -88,6 +88,7 @@ func Http(r chi.Router) { r.Delete("/{id}", cert.Delete) r.Post("/{id}/obtainAuto", cert.ObtainAuto) r.Post("/{id}/obtainManual", cert.ObtainManual) + r.Post("/{id}/obtainSelfSigned", cert.ObtainSelfSigned) r.Post("/{id}/renew", cert.Renew) r.Post("/{id}/manualDNS", cert.ManualDNS) r.Post("/{id}/deploy", cert.Deploy) diff --git a/internal/service/cert.go b/internal/service/cert.go index 379ed0fb..609b7249 100644 --- a/internal/service/cert.go +++ b/internal/service/cert.go @@ -224,6 +224,21 @@ func (s *CertService) ObtainManual(w http.ResponseWriter, r *http.Request) { Success(w, nil) } +func (s *CertService) ObtainSelfSigned(w http.ResponseWriter, r *http.Request) { + req, err := Bind[request.ID](r) + if err != nil { + Error(w, http.StatusUnprocessableEntity, "%v", err) + return + } + + if err = s.certRepo.ObtainSelfSigned(req.ID); err != nil { + Error(w, http.StatusInternalServerError, "%v", err) + return + } + + Success(w, nil) +} + func (s *CertService) Renew(w http.ResponseWriter, r *http.Request) { req, err := Bind[request.ID](r) if err != nil { diff --git a/web/src/api/panel/cert/index.ts b/web/src/api/panel/cert/index.ts index 5481b27a..9d371ed9 100644 --- a/web/src/api/panel/cert/index.ts +++ b/web/src/api/panel/cert/index.ts @@ -53,6 +53,9 @@ export default { // 证书手动签发 obtainManual: (id: number): Promise> => request.post(`/cert/cert/${id}/obtainManual`, { id }), + // 证书自签名签发 + obtainSelfSigned: (id: number): Promise> => + request.post(`/cert/cert/${id}/obtainSelfSigned`, { id }), // 续签 renew: (id: number): Promise> => request.post(`/cert/cert/${id}/renew`, { id }), diff --git a/web/src/views/cert/CertView.vue b/web/src/views/cert/CertView.vue index 43180fec..ee35379f 100644 --- a/web/src/views/cert/CertView.vue +++ b/web/src/views/cert/CertView.vue @@ -181,7 +181,7 @@ const columns: any = [ resizable: true, render(row: any) { return [ - row.type != 'upload' && row.account_id != 0 && row.cert == '' && row.key == '' + row.type != 'upload' && row.cert == '' && row.key == '' ? h( NButton, { diff --git a/web/src/views/cert/ObtainModal.vue b/web/src/views/cert/ObtainModal.vue index dcf03245..2262e093 100644 --- a/web/src/views/cert/ObtainModal.vue +++ b/web/src/views/cert/ObtainModal.vue @@ -13,8 +13,9 @@ const model = ref({ }) const options = [ - { label: '自动验证', value: 'auto' }, - { label: '手动 DNS 验证', value: 'manual' } + { label: '自动', value: 'auto' }, + { label: '手动', value: 'manual' }, + { label: '自签名', value: 'self-signed' } ] const handleSubmit = async () => { @@ -33,7 +34,7 @@ const handleSubmit = async () => { window.$bus.emit('cert:refresh-cert') window.$bus.emit('cert:refresh-async') }) - } else { + } else if (model.value.type == 'manual') { const { data } = await cert.manualDNS(id.value) messageReactive.destroy() window.$message.info('请先前往域名处设置 DNS 解析,再继续签发') @@ -78,6 +79,18 @@ const handleSubmit = async () => { }) } }) + } else { + await cert + .obtainSelfSigned(id.value) + .then(() => { + window.$message.success('签发成功') + show.value = false + }) + .finally(() => { + messageReactive?.destroy() + window.$bus.emit('cert:refresh-cert') + window.$bus.emit('cert:refresh-async') + }) } }