mirror of
https://gitee.com/mirrors/AllinSSL.git
synced 2026-03-08 15:51:11 +08:00
118 lines
3.1 KiB
Go
118 lines
3.1 KiB
Go
package server
|
||
|
||
import (
|
||
"ALLinSSL/backend/middleware"
|
||
"ALLinSSL/backend/public"
|
||
"ALLinSSL/backend/route"
|
||
"context"
|
||
"crypto/tls"
|
||
"encoding/gob"
|
||
"fmt"
|
||
"github.com/gin-contrib/gzip"
|
||
"github.com/gin-contrib/sessions"
|
||
"github.com/gin-contrib/sessions/memstore"
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/tjfoc/gmsm/gmtls"
|
||
"net/http"
|
||
"os"
|
||
"time"
|
||
)
|
||
|
||
func Run() error {
|
||
public.ReloadConfig()
|
||
public.InitLogger(public.LogPath)
|
||
defer public.CloseLogger()
|
||
r := gin.Default()
|
||
|
||
store := memstore.NewStore([]byte("secret")) // 只在内存中,不持久化
|
||
r.Use(sessions.Sessions(public.SessionKey, store))
|
||
r.Use(middleware.LoggerMiddleware())
|
||
r.Use(gzip.Gzip(gzip.DefaultCompression))
|
||
gob.Register(time.Time{})
|
||
r.Use(middleware.SessionAuthMiddleware())
|
||
// r.Use(middleware.OpLoggerMiddleware())
|
||
route.Register(r)
|
||
ctx, cancel := context.WithCancel(context.Background())
|
||
public.ShutdownFunc = cancel
|
||
err := RunServer(ctx, r)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
return nil
|
||
}
|
||
|
||
func RunServer(ctx context.Context, r *gin.Engine) error {
|
||
|
||
// 初始化http服务
|
||
srv := &http.Server{
|
||
Addr: ":" + public.Port,
|
||
Handler: r,
|
||
}
|
||
errchan := make(chan error, 1)
|
||
if public.GetSettingIgnoreError("https") == "1" {
|
||
srv.TLSConfig = &tls.Config{
|
||
MinVersion: tls.VersionTLS12, // 推荐设置最低 TLS 版本
|
||
}
|
||
go func() {
|
||
defer close(errchan)
|
||
err := srv.ListenAndServeTLS("data/https/cert.pem", "data/https/key.pem")
|
||
if err != nil {
|
||
// 读取 SM2 证书和密钥(PEM 格式)
|
||
certPem, err := os.ReadFile("data/https/cert.pem")
|
||
midCertPem, err := os.ReadFile("data/https/mid_cert.pem")
|
||
|
||
keyPem, err := os.ReadFile("data/https/key.pem")
|
||
midKeyPem, err := os.ReadFile("data/https/mid_key.pem")
|
||
|
||
tlsCert, err := gmtls.X509KeyPair(certPem, keyPem)
|
||
midcert, err := gmtls.X509KeyPair(midCertPem, midKeyPem)
|
||
if err != nil {
|
||
errchan <- fmt.Errorf("无法加载国密证书和私钥: %v", err)
|
||
return
|
||
}
|
||
|
||
tlsConfig := &gmtls.Config{
|
||
Certificates: []gmtls.Certificate{tlsCert, midcert}, // 使用国密证书和加密证书
|
||
MinVersion: gmtls.VersionGMSSL,
|
||
MaxVersion: gmtls.VersionGMSSL,
|
||
GMSupport: &gmtls.GMSupport{
|
||
WorkMode: gmtls.ModeGMSSLOnly,
|
||
}, // 启用 GM/T 0024 协议
|
||
CipherSuites: []uint16{
|
||
gmtls.GMTLS_SM2_WITH_SM4_SM3, // 明确指定国密套件
|
||
},
|
||
GetConfigForClient: func(chi *gmtls.ClientHelloInfo) (*gmtls.Config, error) {
|
||
fmt.Printf("客户端 Hello 协议版本: %x, 支持 cipher suites: %+v\n", chi.SupportedVersions, chi.CipherSuites)
|
||
return nil, nil
|
||
},
|
||
}
|
||
//srv.TLSConfig = tlsConfig
|
||
ln, err := gmtls.Listen("tcp", ":"+public.Port, tlsConfig)
|
||
if err != nil {
|
||
errchan <- fmt.Errorf("无法启动国密 HTTPS 服务器: %v", err)
|
||
return
|
||
}
|
||
err = http.Serve(ln, r)
|
||
if err != nil {
|
||
errchan <- err
|
||
}
|
||
}
|
||
}()
|
||
} else {
|
||
go func() {
|
||
defer close(errchan)
|
||
err := srv.ListenAndServe()
|
||
if err != nil {
|
||
errchan <- err
|
||
}
|
||
}()
|
||
}
|
||
select {
|
||
case err := <-errchan:
|
||
return err
|
||
case <-ctx.Done():
|
||
_ = srv.Shutdown(ctx)
|
||
}
|
||
return nil
|
||
}
|