Skip to content

Commit dd02975

Browse files
committed
Log TLS connection errors
Add an error level log message when the GRPCServer rejects TLS client connections FAB-11855 #done Change-Id: I8191670c5e2237bcbab200eab3547e2be0d5f16d Signed-off-by: Gari Singh <gari.r.singh@gmail.com>
1 parent ac27cd0 commit dd02975

File tree

5 files changed

+102
-6
lines changed

5 files changed

+102
-6
lines changed

core/comm/config.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"crypto/x509"
1212
"time"
1313

14+
"github.com/hyperledger/fabric/common/flogging"
1415
"google.golang.org/grpc"
1516
"google.golang.org/grpc/keepalive"
1617
)
@@ -56,6 +57,8 @@ type ServerConfig struct {
5657
// UnaryInterceptors specifies a list of interceptors to apply to unary
5758
// RPCs. They are executed in order.
5859
UnaryInterceptors []grpc.UnaryServerInterceptor
60+
// Logger specifies the logger the server will use
61+
Logger *flogging.FabricLogger
5962
}
6063

6164
// ClientConfig defines the parameters for configuring a GRPCClient instance

core/comm/creds.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"errors"
1212
"net"
1313

14+
"github.com/hyperledger/fabric/common/flogging"
1415
"golang.org/x/net/context"
1516
"google.golang.org/grpc/credentials"
1617
)
@@ -29,19 +30,25 @@ var (
2930

3031
// NewServerTransportCredentials returns a new initialized
3132
// grpc/credentials.TransportCredentials
32-
func NewServerTransportCredentials(serverConfig *tls.Config) credentials.TransportCredentials {
33+
func NewServerTransportCredentials(
34+
serverConfig *tls.Config,
35+
logger *flogging.FabricLogger) credentials.TransportCredentials {
36+
3337
// NOTE: unlike the default grpc/credentials implementation, we do not
3438
// clone the tls.Config which allows us to update it dynamically
3539
serverConfig.NextProtos = alpnProtoStr
3640
// override TLS version and ensure it is 1.2
3741
serverConfig.MinVersion = tls.VersionTLS12
3842
serverConfig.MaxVersion = tls.VersionTLS12
39-
return &serverCreds{serverConfig}
43+
return &serverCreds{
44+
serverConfig: serverConfig,
45+
logger: logger}
4046
}
4147

4248
// serverCreds is an implementation of grpc/credentials.TransportCredentials.
4349
type serverCreds struct {
4450
serverConfig *tls.Config
51+
logger *flogging.FabricLogger
4552
}
4653

4754
// ClientHandShake is not implemented for `serverCreds`.
@@ -54,6 +61,10 @@ func (sc *serverCreds) ClientHandshake(context.Context,
5461
func (sc *serverCreds) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
5562
conn := tls.Server(rawConn, sc.serverConfig)
5663
if err := conn.Handshake(); err != nil {
64+
if sc.logger != nil {
65+
sc.logger.With("remote address",
66+
conn.RemoteAddr().String()).Errorf("TLS handshake failed with error %s", err)
67+
}
5768
return nil, nil, err
5869
}
5970
return conn, credentials.TLSInfo{State: conn.ConnectionState()}, nil
@@ -69,7 +80,7 @@ func (sc *serverCreds) Info() credentials.ProtocolInfo {
6980

7081
// Clone makes a copy of this TransportCredentials.
7182
func (sc *serverCreds) Clone() credentials.TransportCredentials {
72-
creds := NewServerTransportCredentials(sc.serverConfig)
83+
creds := NewServerTransportCredentials(sc.serverConfig, sc.logger)
7384
return creds
7485
}
7586

core/comm/creds_test.go

Lines changed: 77 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,100 @@ SPDX-License-Identifier: Apache-2.0
77
package comm_test
88

99
import (
10+
"bytes"
1011
"crypto/tls"
12+
"crypto/x509"
13+
"fmt"
14+
"io/ioutil"
15+
"net"
16+
"path/filepath"
1117
"testing"
1218

1319
"google.golang.org/grpc/credentials"
1420

21+
"github.com/hyperledger/fabric/common/flogging"
1522
"github.com/hyperledger/fabric/core/comm"
1623
"github.com/stretchr/testify/assert"
1724
)
1825

1926
func TestCreds(t *testing.T) {
2027
t.Parallel()
28+
29+
caPEM, err := ioutil.ReadFile(filepath.Join("testdata", "certs", "Org1-cert.pem"))
30+
if err != nil {
31+
t.Fatalf("failed to read root certificate: %v", err)
32+
}
33+
certPool := x509.NewCertPool()
34+
ok := certPool.AppendCertsFromPEM(caPEM)
35+
if !ok {
36+
t.Fatalf("failed to create certPool")
37+
}
38+
cert, err := tls.LoadX509KeyPair(
39+
filepath.Join("testdata", "certs", "Org1-server1-cert.pem"),
40+
filepath.Join("testdata", "certs", "Org1-server1-key.pem"))
41+
if err != nil {
42+
t.Fatalf("failed to load TLS certificate [%s]", err)
43+
}
44+
tlsConfig := &tls.Config{
45+
Certificates: []tls.Certificate{cert}}
46+
47+
buf := &bytes.Buffer{}
48+
conf := flogging.Config{
49+
Writer: buf}
50+
logging, err := flogging.New(conf)
51+
if err != nil {
52+
t.Fatalf("error creating logger [%s]", err)
53+
}
54+
logger := logging.Logger("creds")
2155
var creds credentials.TransportCredentials
22-
creds = comm.NewServerTransportCredentials(&tls.Config{})
23-
_, _, err := creds.ClientHandshake(nil, "", nil)
56+
creds = comm.NewServerTransportCredentials(tlsConfig, logger)
57+
_, _, err = creds.ClientHandshake(nil, "", nil)
2458
assert.EqualError(t, err, comm.ClientHandshakeNotImplError.Error())
2559
err = creds.OverrideServerName("")
2660
assert.EqualError(t, err, comm.OverrrideHostnameNotSupportedError.Error())
2761
clone := creds.Clone()
2862
assert.Equal(t, creds, clone)
2963
assert.Equal(t, "1.2", creds.Info().SecurityVersion)
3064
assert.Equal(t, "tls", creds.Info().SecurityProtocol)
65+
66+
lis, err := net.Listen("tcp", "localhost:0")
67+
if err != nil {
68+
t.Fatalf("failed to start listener [%s]", err)
69+
}
70+
defer lis.Close()
71+
72+
go func() {
73+
conn, err := lis.Accept()
74+
if err != nil {
75+
t.Logf("failed to accept connection [%s]", err)
76+
}
77+
_, _, err = creds.ServerHandshake(conn)
78+
if err != nil {
79+
t.Logf("ServerHandshake error [%s]", err)
80+
}
81+
conn, err = lis.Accept()
82+
if err != nil {
83+
t.Logf("failed to accept connection [%s]", err)
84+
}
85+
_, _, err = creds.ServerHandshake(conn)
86+
if err != nil {
87+
t.Logf("ServerHandshake error [%s]", err)
88+
}
89+
}()
90+
91+
_, port, err := net.SplitHostPort(lis.Addr().String())
92+
if err != nil {
93+
t.Fatalf("failed to get server port [%s]", err)
94+
}
95+
_, err = tls.Dial("tcp", fmt.Sprintf("localhost:%s", port),
96+
&tls.Config{RootCAs: certPool})
97+
assert.NoError(t, err)
98+
99+
_, err = tls.Dial("tcp", fmt.Sprintf("localhost:%s", port),
100+
&tls.Config{
101+
RootCAs: certPool,
102+
MaxVersion: tls.VersionTLS10})
103+
assert.Contains(t, err.Error(), "protocol version not supported")
104+
assert.Contains(t, buf.String(), "TLS handshake failed with error")
105+
31106
}

core/comm/server.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,8 @@ func NewGRPCServerFromListener(listener net.Listener, serverConfig ServerConfig)
112112
}
113113

114114
// create credentials and add to server options
115-
creds := NewServerTransportCredentials(grpcServer.tlsConfig)
115+
creds := NewServerTransportCredentials(grpcServer.tlsConfig,
116+
serverConfig.Logger)
116117
serverOpts = append(serverOpts, grpc.Creds(creds))
117118
} else {
118119
return nil, errors.New("serverConfig.SecOpts must contain both Key and " +

peer/node/start.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
ccdef "github.com/hyperledger/fabric/common/chaincode"
2121
"github.com/hyperledger/fabric/common/crypto/tlsgen"
2222
"github.com/hyperledger/fabric/common/deliver"
23+
"github.com/hyperledger/fabric/common/flogging"
2324
"github.com/hyperledger/fabric/common/localmsp"
2425
"github.com/hyperledger/fabric/common/policies"
2526
"github.com/hyperledger/fabric/common/viperutil"
@@ -195,6 +196,7 @@ func serve(args []string) error {
195196
if err != nil {
196197
logger.Fatalf("Error loading secure config for peer (%s)", err)
197198
}
199+
serverConfig.Logger = flogging.MustGetLogger("core/comm").With("server", "PeerServer")
198200
peerServer, err := peer.NewPeerServer(listenAddr, serverConfig)
199201
if err != nil {
200202
logger.Fatalf("Failed to create peer server (%s)", err)
@@ -456,6 +458,9 @@ func createChaincodeServer(ca tlsgen.CA, peerHostname string) (srv *comm.GRPCSer
456458
return nil, "", err
457459
}
458460

461+
// set the logger for the server
462+
config.Logger = flogging.MustGetLogger("core/comm").With("server", "ChaincodeServer")
463+
459464
// Override TLS configuration if TLS is applicable
460465
if config.SecOpts.UseTLS {
461466
// Create a self-signed TLS certificate with a SAN that matches the computed chaincode endpoint
@@ -649,6 +654,7 @@ func startAdminServer(peerListenAddr string, peerServer *grpc.Server) {
649654
if separateLsnrForAdmin {
650655
logger.Info("Creating gRPC server for admin service on", adminListenAddress)
651656
serverConfig, err := peer.GetServerConfig()
657+
serverConfig.Logger = flogging.MustGetLogger("core/comm").With("server", "AdminServer")
652658
if err != nil {
653659
logger.Fatalf("Error loading secure config for admin service (%s)", err)
654660
}

0 commit comments

Comments
 (0)