Skip to content

Commit a4b0def

Browse files
committed
底层支持国密TLS
1 parent 68c26ff commit a4b0def

File tree

4 files changed

+40
-25
lines changed

4 files changed

+40
-25
lines changed

config/cert.go

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package config
22

33
import (
4+
"crypto/tls"
45
"errors"
56
"fmt"
67
"os"
@@ -16,16 +17,16 @@ var (
1617
errorCertificateNotExit = errors.New("not exist cert")
1718
)
1819

19-
type Cert struct {
20-
certs map[string]*gmtls.Certificate
20+
type Cert[T any] struct {
21+
certs map[string]*T
2122
}
2223

23-
func NewCert(certs map[string]*gmtls.Certificate) *Cert {
24-
return &Cert{certs: certs}
24+
func NewCert[T any](certs map[string]*T) *Cert[T] {
25+
return &Cert[T]{certs: certs}
2526
}
2627

27-
func LoadCert(certs []CertConfig, dir string) (*Cert, error) {
28-
cs := make(map[string]*gmtls.Certificate)
28+
func LoadCert(certs []CertConfig, dir string) (*Cert[tls.Certificate], error) {
29+
cs := make(map[string]*tls.Certificate)
2930
for _, c := range certs {
3031
if c.Key != "" && c.Cert != "" {
3132
cert, err := loadCert(c.Cert, c.Key, dir)
@@ -79,31 +80,39 @@ func LoadCert(certs []CertConfig, dir string) (*Cert, error) {
7980
}
8081
}
8182
}
82-
return NewCert(cs), nil
83+
return NewCert[tls.Certificate](cs), nil
8384
}
8485

85-
func loadCert(pem string, key string, dir string) (*gmtls.Certificate, error) {
86+
func loadCert(pem string, key string, dir string) (*tls.Certificate, error) {
8687
if !filepath.IsAbs(pem) {
8788
pem = fmt.Sprintf("%s/%s", strings.TrimSuffix(dir, "/"), strings.TrimPrefix(pem, "/"))
8889
}
8990
if !filepath.IsAbs(key) {
9091
key = fmt.Sprintf("%s/%s", strings.TrimSuffix(dir, "/"), strings.TrimPrefix(key, "/"))
9192
}
92-
cert, err := gmtls.LoadX509KeyPair(pem, key)
93+
cert, err := tls.LoadX509KeyPair(pem, key)
9394
return &cert, err
9495
}
9596

96-
func (c *Cert) GetCertificate(clientHello *gmtls.ClientHelloInfo) (*gmtls.Certificate, error) {
97+
func (c *Cert[T]) GetCertificate(clientHello interface{}) (*T, error) {
9798
if c.certs == nil {
9899
return nil, errorCertificateNotExit
99100
}
101+
name := ""
102+
switch t := clientHello.(type) {
103+
case *tls.ClientHelloInfo:
104+
name = strings.ToLower(t.ServerName)
105+
case *gmtls.ClientHelloInfo:
106+
name = strings.ToLower(t.ServerName)
107+
default:
108+
return nil, fmt.Errorf("unsupported type %T for GetCertificate", clientHello)
109+
}
100110
if len(c.certs) == 1 {
101111
// There's only one choice, so no point doing any work.
102112
for _, cert := range c.certs {
103113
return cert, nil
104114
}
105115
}
106-
name := strings.ToLower(clientHello.ServerName)
107116
if cert, ok := c.certs[name]; ok {
108117
return cert, nil
109118
}
@@ -118,3 +127,9 @@ func (c *Cert) GetCertificate(clientHello *gmtls.ClientHelloInfo) (*gmtls.Certif
118127

119128
return nil, errorCertificateNotExit
120129
}
130+
131+
func GetCertificateFunc(cert *Cert[tls.Certificate]) func(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
132+
return func(info *tls.ClientHelloInfo) (*tls.Certificate, error) {
133+
return cert.GetCertificate(info)
134+
}
135+
}

process-master/master.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ import (
2020
"net/url"
2121
"strings"
2222

23-
"github.com/tjfoc/gmsm/gmtls"
24-
2523
"github.com/eolinker/eosc/process-master/proxy"
2624

2725
"github.com/eolinker/eosc/etcd"
@@ -264,7 +262,7 @@ func (m *Master) Start(handler *MasterHandler) error {
264262

265263
func (m *Master) listen(conf config.UrlConfig) (net.Listener, error) {
266264
tf := traffic.NewTraffic(m.adminTraffic)
267-
tcp, ssl := tf.Listen(conf.ListenUrls...)
265+
tcp, ssl, _ := tf.Listen(conf.ListenUrls...)
268266

269267
listener := make([]net.Listener, 0, len(tcp)+len(ssl))
270268
listener = append(listener, tcp...)
@@ -273,12 +271,12 @@ func (m *Master) listen(conf config.UrlConfig) (net.Listener, error) {
273271
if err != nil {
274272
return nil, err
275273
}
276-
tlsConf := &gmtls.Config{
277-
GetCertificate: cert.GetCertificate,
274+
tlsConf := &tls.Config{
275+
GetCertificate: config.GetCertificateFunc(cert),
278276
MaxVersion: tls.VersionTLS13,
279277
}
280278
for _, l := range ssl {
281-
listener = append(listener, gmtls.NewListener(l, tlsConf))
279+
listener = append(listener, tls.NewListener(l, tlsConf))
282280
}
283281
}
284282
if len(listener) == 0 {

traffic/traffic.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ var (
2626
)
2727

2828
type ITraffic interface {
29-
Listen(addrs ...string) (tcp []net.Listener, ssl []net.Listener)
29+
Listen(addrs ...string) (tcp []net.Listener, ssl []net.Listener, gmSsl []net.Listener)
3030
IsStop() bool
3131
Close()
3232
}
@@ -42,7 +42,7 @@ const (
4242
bitBoth = bitTCP | bitSSL
4343
)
4444

45-
func (t *Traffic) Listen(addrs ...string) (tcp []net.Listener, ssl []net.Listener) {
45+
func (t *Traffic) Listen(addrs ...string) (tcp []net.Listener, ssl []net.Listener, gmSsl []net.Listener) {
4646

4747
schemes := make(map[string]int)
4848
for _, addr := range addrs {
@@ -63,19 +63,20 @@ func (t *Traffic) Listen(addrs ...string) (tcp []net.Listener, ssl []net.Listene
6363
case bitBoth:
6464
{
6565
cMux := cmux.New(listener)
66-
ssl = append(ssl, cMux.Match(cmux.TLS(gmtls.VersionGMSSL, gmtls.VersionSSL30, gmtls.VersionTLS10, gmtls.VersionTLS11, gmtls.VersionTLS12, tls.VersionTLS13)))
66+
ssl = append(ssl, cMux.Match(cmux.TLS(tls.VersionSSL30, tls.VersionTLS10, tls.VersionTLS11, tls.VersionTLS12, tls.VersionTLS13)))
67+
gmSsl = append(gmSsl, cMux.Match(cmux.TLS(gmtls.VersionGMSSL)))
6768
tcp = append(tcp, cMux.Match(cmux.Any()))
6869
go runMux(cMux)
69-
7070
}
7171
case bitTCP:
7272
tcp = append(tcp, listener)
7373
case bitSSL:
7474
ssl = append(ssl, listener)
75+
gmSsl = append(gmSsl, listener)
7576
}
7677

7778
}
78-
return tcp, ssl
79+
return tcp, ssl, gmSsl
7980
}
8081
func runMux(c cmux.CMux) {
8182
err := c.Serve()
@@ -125,8 +126,8 @@ func FromArg(traffics []*PbTraffic) ITraffic {
125126
type EmptyTraffic struct {
126127
}
127128

128-
func (e *EmptyTraffic) Listen(addrs ...string) (tcp []net.Listener, ssl []net.Listener) {
129-
return nil, nil
129+
func (e *EmptyTraffic) Listen(addrs ...string) (tcp []net.Listener, ssl []net.Listener, gmSsl []net.Listener) {
130+
return nil, nil, gmSsl
130131
}
131132

132133
func (e *EmptyTraffic) IsStop() bool {

traffic/traffic_test.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package traffic
22

33
import (
44
"fmt"
5+
56
"github.com/eolinker/eosc/config"
67

78
"testing"
@@ -17,7 +18,7 @@ func ExampleListen() {
1718
tfData = NewTrafficData(tfData.data)
1819
tf := NewTraffic(tfData)
1920

20-
tcps, ssls := tf.Listen(addrs...)
21+
tcps, ssls, _ := tf.Listen(addrs...)
2122
fmt.Println("tcp")
2223
for _, l := range tcps {
2324

0 commit comments

Comments
 (0)