Skip to content

Commit 538be53

Browse files
committed
fix: renewed certificate and private key not save #391
1 parent c1c1094 commit 538be53

File tree

5 files changed

+81
-57
lines changed

5 files changed

+81
-57
lines changed

api/certificate/issue.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ func IssueCert(c *gin.Context) {
9595
log := &cert.Logger{}
9696
log.SetCertModel(&certModel)
9797

98+
payload.CertID = certModel.ID
99+
98100
go cert.IssueCert(payload, logChan, errChan)
99101

100102
go handleIssueCertLogChan(ws, log, logChan)

internal/cert/auto_cert.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ func autoCert(certModel *model.Cert) {
7171

7272
// support SAN certification
7373
payload := &ConfigPayload{
74+
CertID: certModel.ID,
7475
ServerName: certModel.Domains,
7576
ChallengeMethod: certModel.ChallengeMethod,
7677
DNSCredentialID: certModel.DnsCredentialID,

internal/cert/obtain.go

Lines changed: 1 addition & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
package cert
22

33
import (
4-
"github.com/0xJacky/Nginx-UI/internal/nginx"
54
"github.com/0xJacky/Nginx-UI/model"
65
"github.com/go-acme/lego/v4/certificate"
76
"github.com/go-acme/lego/v4/lego"
87
"github.com/pkg/errors"
98
"log"
10-
"os"
11-
"path/filepath"
12-
"strings"
139
)
1410

1511
func obtain(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan chan error) {
@@ -31,33 +27,6 @@ func obtain(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan
3127
IssuerCertificate: certificates.IssuerCertificate,
3228
CSR: certificates.CSR,
3329
}
34-
name := strings.Join(payload.ServerName, "_")
35-
saveDir := nginx.GetConfPath("ssl/" + name + "_" + string(payload.KeyType))
36-
if _, err = os.Stat(saveDir); os.IsNotExist(err) {
37-
err = os.MkdirAll(saveDir, 0755)
38-
if err != nil {
39-
errChan <- errors.Wrap(err, "mkdir error")
40-
return
41-
}
42-
}
43-
44-
// Each certificate comes back with the cert bytes, the bytes of the client's
45-
// private key, and a certificate URL. SAVE THESE TO DISK.
46-
l.Println("[INFO] [Nginx UI] Writing certificate to disk")
47-
err = os.WriteFile(filepath.Join(saveDir, "fullchain.cer"),
48-
certificates.Certificate, 0644)
49-
50-
if err != nil {
51-
errChan <- errors.Wrap(err, "write fullchain.cer error")
52-
return
53-
}
54-
55-
l.Println("[INFO] [Nginx UI] Writing certificate private key to disk")
56-
err = os.WriteFile(filepath.Join(saveDir, "private.key"),
57-
certificates.PrivateKey, 0644)
5830

59-
if err != nil {
60-
errChan <- errors.Wrap(err, "write private.key error")
61-
return
62-
}
31+
payload.WriteFile(l, errChan)
6332
}

internal/cert/payload.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,20 @@ package cert
33
import (
44
"github.com/0xJacky/Nginx-UI/internal/helper"
55
"github.com/0xJacky/Nginx-UI/internal/logger"
6+
"github.com/0xJacky/Nginx-UI/internal/nginx"
67
"github.com/0xJacky/Nginx-UI/model"
78
"github.com/0xJacky/Nginx-UI/query"
89
"github.com/go-acme/lego/v4/certcrypto"
10+
"github.com/pkg/errors"
11+
"log"
12+
"os"
13+
"path/filepath"
14+
"strings"
915
"time"
1016
)
1117

1218
type ConfigPayload struct {
19+
CertID int `json:"cert_id"`
1320
ServerName []string `json:"server_name"`
1421
ChallengeMethod string `json:"challenge_method"`
1522
DNSCredentialID int `json:"dns_credential_id"`
@@ -38,3 +45,46 @@ func (c *ConfigPayload) GetACMEUser() (user *model.AcmeUser, err error) {
3845
func (c *ConfigPayload) GetKeyType() certcrypto.KeyType {
3946
return helper.GetKeyType(c.KeyType)
4047
}
48+
49+
func (c *ConfigPayload) WriteFile(l *log.Logger, errChan chan error) {
50+
name := strings.Join(c.ServerName, "_")
51+
saveDir := nginx.GetConfPath("ssl/" + name + "_" + string(c.KeyType))
52+
if _, err := os.Stat(saveDir); os.IsNotExist(err) {
53+
err = os.MkdirAll(saveDir, 0755)
54+
if err != nil {
55+
errChan <- errors.Wrap(err, "mkdir error")
56+
return
57+
}
58+
}
59+
60+
// Each certificate comes back with the cert bytes, the bytes of the client's
61+
// private key, and a certificate URL. SAVE THESE TO DISK.
62+
l.Println("[INFO] [Nginx UI] Writing certificate to disk")
63+
err := os.WriteFile(filepath.Join(saveDir, "fullchain.cer"),
64+
c.Resource.Certificate, 0644)
65+
66+
if err != nil {
67+
errChan <- errors.Wrap(err, "write fullchain.cer error")
68+
return
69+
}
70+
71+
l.Println("[INFO] [Nginx UI] Writing certificate private key to disk")
72+
err = os.WriteFile(filepath.Join(saveDir, "private.key"),
73+
c.Resource.PrivateKey, 0644)
74+
75+
if err != nil {
76+
errChan <- errors.Wrap(err, "write private.key error")
77+
return
78+
}
79+
80+
// update database
81+
if c.CertID <= 0 {
82+
return
83+
}
84+
85+
db := model.UseDB()
86+
db.Where("id = ?", c.CertID).Updates(&model.Cert{
87+
SSLCertificatePath: filepath.Join(saveDir, "fullchain.cer"),
88+
SSLCertificateKeyPath: filepath.Join(saveDir, "private.key"),
89+
})
90+
}

internal/cert/renew.go

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
11
package cert
22

33
import (
4-
"github.com/0xJacky/Nginx-UI/model"
5-
"github.com/go-acme/lego/v4/certificate"
6-
"github.com/go-acme/lego/v4/lego"
7-
"github.com/pkg/errors"
8-
"log"
4+
"github.com/0xJacky/Nginx-UI/model"
5+
"github.com/go-acme/lego/v4/certificate"
6+
"github.com/go-acme/lego/v4/lego"
7+
"github.com/pkg/errors"
8+
"log"
99
)
1010

1111
func renew(payload *ConfigPayload, client *lego.Client, l *log.Logger, errChan chan error) {
12-
if payload.Resource == nil {
13-
errChan <- errors.New("resource is nil")
14-
return
15-
}
12+
if payload.Resource == nil {
13+
errChan <- errors.New("resource is nil")
14+
return
15+
}
1616

17-
options := &certificate.RenewOptions{
18-
Bundle: true,
19-
}
17+
options := &certificate.RenewOptions{
18+
Bundle: true,
19+
}
2020

21-
cert, err := client.Certificate.RenewWithOptions(payload.Resource.GetResource(), options)
22-
if err != nil {
23-
errChan <- errors.Wrap(err, "renew cert error")
24-
return
25-
}
21+
cert, err := client.Certificate.RenewWithOptions(payload.Resource.GetResource(), options)
22+
if err != nil {
23+
errChan <- errors.Wrap(err, "renew cert error")
24+
return
25+
}
2626

27-
payload.Resource = &model.CertificateResource{
28-
Resource: cert,
29-
PrivateKey: cert.PrivateKey,
30-
Certificate: cert.Certificate,
31-
IssuerCertificate: cert.IssuerCertificate,
32-
CSR: cert.CSR,
33-
}
27+
payload.Resource = &model.CertificateResource{
28+
Resource: cert,
29+
PrivateKey: cert.PrivateKey,
30+
Certificate: cert.Certificate,
31+
IssuerCertificate: cert.IssuerCertificate,
32+
CSR: cert.CSR,
33+
}
3434

35-
l.Println("[INFO] [Nginx UI] Certificate renewed successfully")
35+
payload.WriteFile(l, errChan)
36+
37+
l.Println("[INFO] [Nginx UI] Certificate renewed successfully")
3638
}

0 commit comments

Comments
 (0)