Skip to content

Commit d67d6b8

Browse files
authored
Merge pull request #39 from ZLBer/tls_support
feat: grpc tls support
2 parents dde4119 + 05f34cd commit d67d6b8

3 files changed

Lines changed: 91 additions & 0 deletions

File tree

pkg/config/config.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ type Option struct {
6161

6262
// proxy mode for gateway
6363
ProxyModeEnable bool
64+
65+
//tls
66+
CACertFile string
67+
TLSCertFile string
68+
TLSKeyFile string
69+
TLSServerName string
6470
}
6571

6672
// Validate sets empty field to default config

pkg/triple/dubbo3_client.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,17 @@ package triple
1919

2020
import (
2121
"context"
22+
"crypto/tls"
23+
"crypto/x509"
24+
"io/ioutil"
2225
"reflect"
2326
"sync"
2427
)
2528

2629
import (
2730
"github.com/dubbogo/grpc-go"
2831
"github.com/dubbogo/grpc-go/codes"
32+
"github.com/dubbogo/grpc-go/credentials"
2933
"github.com/dubbogo/grpc-go/encoding"
3034
"github.com/dubbogo/grpc-go/encoding/hessian"
3135
"github.com/dubbogo/grpc-go/encoding/msgpack"
@@ -87,6 +91,13 @@ func NewTripleClient(impl interface{}, opt *config.Option) (*TripleClient, error
8791
)
8892
}
8993

94+
if creds, err := getClientTlsCertificate(opt); err != nil {
95+
opt.Logger.Errorf("TripleClient.Start: TLS config err: %v", err)
96+
return nil, err
97+
} else if creds != nil {
98+
dialOpts = append(dialOpts, grpc.WithTransportCredentials(creds))
99+
}
100+
90101
defaultCallOpts := make([]grpc.CallOption, 0)
91102
// max send/receive size
92103
if opt.GRPCMaxCallSendMsgSize != 0 {
@@ -193,3 +204,34 @@ func (t *TripleClient) Close() {
193204
func (t *TripleClient) IsAvailable() bool {
194205
return true
195206
}
207+
208+
func getClientTlsCertificate(opt *config.Option) (credentials.TransportCredentials, error) {
209+
// no TLS
210+
if opt.TLSCertFile == "" && opt.TLSKeyFile == "" {
211+
return nil, nil
212+
}
213+
214+
if opt.CACertFile == "" {
215+
return credentials.NewClientTLSFromFile(opt.TLSCertFile, opt.TLSServerName)
216+
}
217+
218+
// need mTLS
219+
ca := x509.NewCertPool()
220+
caBytes, err := ioutil.ReadFile(opt.CACertFile)
221+
if err != nil {
222+
return nil, err
223+
}
224+
if ok := ca.AppendCertsFromPEM(caBytes); !ok {
225+
return nil, err
226+
}
227+
cert, err := tls.LoadX509KeyPair(opt.TLSCertFile, opt.TLSKeyFile)
228+
if err != nil {
229+
return nil, err
230+
}
231+
232+
return credentials.NewTLS(&tls.Config{
233+
ServerName: opt.TLSServerName,
234+
Certificates: []tls.Certificate{cert},
235+
RootCAs: ca,
236+
}), nil
237+
}

pkg/triple/dubbo3_server.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ package triple
1919

2020
import (
2121
"context"
22+
"crypto/tls"
23+
"crypto/x509"
2224
"fmt"
25+
"io/ioutil"
2326
"net"
2427
"reflect"
2528
"sync"
@@ -36,6 +39,8 @@ import (
3639
"github.com/dubbogo/grpc-go/encoding/raw_proto"
3740

3841
perrors "github.com/pkg/errors"
42+
43+
"github.com/dubbogo/grpc-go/credentials"
3944
)
4045

4146
import (
@@ -215,6 +220,14 @@ func newGrpcServerWithCodec(opt *config.Option) *grpc.Server {
215220
if opt.ProxyModeEnable {
216221
serverOpts = append(serverOpts, grpc.ProxyModeEnable(true))
217222
}
223+
// TLS config
224+
if creds, err := getServerTlsCertificate(opt); err != nil {
225+
if err != nil {
226+
opt.Logger.Errorf("TripleClient.Start: TLS config err: %v", err)
227+
}
228+
} else if creds != nil {
229+
serverOpts = append(serverOpts, grpc.Creds(creds))
230+
}
218231

219232
var err error
220233
switch opt.CodecType {
@@ -289,3 +302,33 @@ func (t *TripleServer) RefreshService() {
289302
t.grpcServer = grpcServer
290303
t.lst = lst
291304
}
305+
306+
func getServerTlsCertificate(opt *config.Option) (credentials.TransportCredentials, error) {
307+
// no TLS
308+
if opt.TLSCertFile == "" && opt.TLSKeyFile == "" {
309+
return nil, nil
310+
}
311+
var ca *x509.CertPool
312+
cfg := &tls.Config{}
313+
// need mTLS
314+
if opt.CACertFile != "" {
315+
ca = x509.NewCertPool()
316+
caBytes, err := ioutil.ReadFile(opt.CACertFile)
317+
if err != nil {
318+
return nil, err
319+
}
320+
if ok := ca.AppendCertsFromPEM(caBytes); !ok {
321+
return nil, err
322+
}
323+
cfg.ClientAuth = tls.RequireAndVerifyClientCert
324+
cfg.ClientCAs = ca
325+
}
326+
cert, err := tls.LoadX509KeyPair(opt.TLSCertFile, opt.TLSKeyFile)
327+
if err != nil {
328+
return nil, err
329+
}
330+
cfg.Certificates = []tls.Certificate{cert}
331+
cfg.ServerName = opt.TLSServerName
332+
333+
return credentials.NewTLS(cfg), nil
334+
}

0 commit comments

Comments
 (0)