Skip to content

Commit 4de3260

Browse files
feat(system-security): Add API for Synchronizing System Certificates
1 parent ddd8b6b commit 4de3260

File tree

6 files changed

+85
-21
lines changed

6 files changed

+85
-21
lines changed

agent/app/service/website_ssl.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"crypto/x509"
77
"encoding/pem"
88
"fmt"
9+
http2 "github.com/1Panel-dev/1Panel/agent/utils/http"
910
"log"
1011
"os"
1112
"path"
@@ -204,6 +205,10 @@ func reloadSystemSSL(websiteSSL *model.WebsiteSSL, logger *log.Logger) {
204205
logger.Printf("Failed to update the SSL certificate for 1Panel System domain [%s] , err:%s", websiteSSL.PrimaryDomain, err.Error())
205206
return
206207
}
208+
if err := http2.PostLocalCore("/core/settings/ssl/reload"); err != nil {
209+
logger.Printf("Failed to update the SSL certificate for 1Panel System domain [%s] , err:%s", websiteSSL.PrimaryDomain, err.Error())
210+
return
211+
}
207212
printSSLLog(logger, "UpdateSystemSSLSuccess", nil, logger == nil)
208213
}
209214
}

agent/utils/http/core.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package http
2+
3+
import (
4+
"bytes"
5+
"fmt"
6+
"github.com/1Panel-dev/1Panel/agent/app/repo"
7+
"net/http"
8+
)
9+
10+
func PostLocalCore(url string) error {
11+
settingRepo := repo.NewISettingRepo()
12+
port, err := settingRepo.GetValueByKey("ServerPort")
13+
if err != nil {
14+
return err
15+
}
16+
sslStatus, err := settingRepo.GetValueByKey("SSL")
17+
if err != nil {
18+
return err
19+
}
20+
var prefix string
21+
if sslStatus == "Disable" {
22+
prefix = "http://"
23+
} else {
24+
prefix = "https://"
25+
}
26+
reloadURL := fmt.Sprintf("%s://127.0.0.1:%s/api/v2%s", prefix, port, url)
27+
req, err := http.NewRequest("POST", reloadURL, bytes.NewBuffer([]byte{}))
28+
if err != nil {
29+
return err
30+
}
31+
client := &http.Client{}
32+
resp, err := client.Do(req)
33+
if err != nil {
34+
return err
35+
}
36+
defer resp.Body.Close()
37+
return nil
38+
}

core/app/api/v2/setting.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,3 +369,16 @@ func (b *BaseApi) MFABind(c *gin.Context) {
369369

370370
helper.SuccessWithData(c, nil)
371371
}
372+
373+
func (b *BaseApi) ReloadSSL(c *gin.Context) {
374+
clientIP := c.ClientIP()
375+
if clientIP != "127.0.0.1" {
376+
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, errors.New("only localhost can reload ssl"))
377+
return
378+
}
379+
if err := settingService.UpdateSystemSSL(); err != nil {
380+
helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err)
381+
return
382+
}
383+
helper.SuccessWithOutData(c)
384+
}

core/app/service/setting.go

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ type ISettingService interface {
4040

4141
GetTerminalInfo() (*dto.TerminalInfo, error)
4242
UpdateTerminal(req dto.TerminalInfo) error
43+
44+
UpdateSystemSSL() error
4345
}
4446

4547
func NewISettingService() ISettingService {
@@ -198,15 +200,6 @@ func (u *SettingService) UpdateSSL(c *gin.Context, req dto.SSLUpdate) error {
198200
}
199201
_ = os.Remove(path.Join(secretDir, "server.crt"))
200202
_ = os.Remove(path.Join(secretDir, "server.key"))
201-
sID, _ := c.Cookie(constant.SessionName)
202-
c.SetCookie(constant.SessionName, sID, 0, "", "", false, true)
203-
204-
go func() {
205-
_, err := cmd.Exec("systemctl restart 1panel.service")
206-
if err != nil {
207-
global.LOG.Errorf("restart system failed, err: %v", err)
208-
}
209-
}()
210203
return nil
211204
}
212205
if _, err := os.Stat(secretDir); err != nil && os.IsNotExist(err) {
@@ -257,17 +250,7 @@ func (u *SettingService) UpdateSSL(c *gin.Context, req dto.SSLUpdate) error {
257250
if err := settingRepo.Update("SSL", req.SSL); err != nil {
258251
return err
259252
}
260-
261-
sID, _ := c.Cookie(constant.SessionName)
262-
c.SetCookie(constant.SessionName, sID, 0, "", "", true, true)
263-
go func() {
264-
time.Sleep(1 * time.Second)
265-
_, err := cmd.Exec("systemctl restart 1panel.service")
266-
if err != nil {
267-
global.LOG.Errorf("restart system failed, err: %v", err)
268-
}
269-
}()
270-
return nil
253+
return u.UpdateSystemSSL()
271254
}
272255

273256
func (u *SettingService) LoadFromCert() (*dto.SSLInfo, error) {
@@ -394,6 +377,25 @@ func (u *SettingService) UpdatePassword(c *gin.Context, old, new string) error {
394377
return nil
395378
}
396379

380+
func (u *SettingService) UpdateSystemSSL() error {
381+
certPath := path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt")
382+
keyPath := path.Join(global.CONF.System.BaseDir, "1panel/secret/server.key")
383+
certificate, err := os.ReadFile(certPath)
384+
if err != nil {
385+
return err
386+
}
387+
key, err := os.ReadFile(keyPath)
388+
if err != nil {
389+
return err
390+
}
391+
cert, err := tls.X509KeyPair(certificate, key)
392+
if err != nil {
393+
return err
394+
}
395+
constant.CertStore.Store(&cert)
396+
return nil
397+
}
398+
397399
func loadInfoFromCert() (dto.SSLInfo, error) {
398400
var info dto.SSLInfo
399401
certFile := path.Join(global.CONF.System.BaseDir, "1panel/secret/server.crt")

core/router/ro_setting.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ func (s *SettingRouter) InitRouter(Router *gin.RouterGroup) {
1616
Use(middleware.JwtAuth()).
1717
Use(middleware.SessionAuth()).
1818
Use(middleware.PasswordExpired())
19+
20+
noAuthRouter := Router.Group("settings")
1921
baseApi := v2.ApiGroupApp.BaseApi
2022
{
2123
router.POST("/search", baseApi.GetSettingInfo)
@@ -39,5 +41,7 @@ func (s *SettingRouter) InitRouter(Router *gin.RouterGroup) {
3941
settingRouter.POST("/upgrade", baseApi.Upgrade)
4042
settingRouter.POST("/upgrade/notes", baseApi.GetNotesByVersion)
4143
settingRouter.GET("/upgrade", baseApi.GetUpgradeInfo)
44+
45+
noAuthRouter.POST("/ssl/reload", baseApi.ReloadSSL)
4246
}
4347
}

core/server/server.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,9 +73,11 @@ func Start() {
7373
if err != nil {
7474
panic(err)
7575
}
76+
constant.CertStore.Store(&cert)
77+
7678
server.TLSConfig = &tls.Config{
7779
GetCertificate: func(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
78-
return &cert, nil
80+
return constant.CertStore.Load().(*tls.Certificate), nil
7981
},
8082
}
8183
global.LOG.Infof("listen at https://%s:%s [%s]", global.CONF.System.BindAddress, global.CONF.System.Port, tcpItem)

0 commit comments

Comments
 (0)