github.com/yous1230/fabric@v2.0.0-beta.0.20191224111736-74345bee6ac2+incompatible/core/comm/creds_test.go (about)

     1  /*
     2  Copyright IBM Corp. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package comm_test
     8  
     9  import (
    10  	"context"
    11  	"crypto/tls"
    12  	"crypto/x509"
    13  	"io/ioutil"
    14  	"net"
    15  	"path/filepath"
    16  	"sync"
    17  	"testing"
    18  
    19  	"github.com/hyperledger/fabric/common/flogging/floggingtest"
    20  	"github.com/hyperledger/fabric/core/comm"
    21  	"github.com/stretchr/testify/assert"
    22  )
    23  
    24  func TestCreds(t *testing.T) {
    25  	t.Parallel()
    26  
    27  	caPEM, err := ioutil.ReadFile(filepath.Join("testdata", "certs", "Org1-cert.pem"))
    28  	if err != nil {
    29  		t.Fatalf("failed to read root certificate: %v", err)
    30  	}
    31  	certPool := x509.NewCertPool()
    32  	ok := certPool.AppendCertsFromPEM(caPEM)
    33  	if !ok {
    34  		t.Fatalf("failed to create certPool")
    35  	}
    36  	cert, err := tls.LoadX509KeyPair(
    37  		filepath.Join("testdata", "certs", "Org1-server1-cert.pem"),
    38  		filepath.Join("testdata", "certs", "Org1-server1-key.pem"),
    39  	)
    40  	if err != nil {
    41  		t.Fatalf("failed to load TLS certificate [%s]", err)
    42  	}
    43  	tlsConfig := &tls.Config{
    44  		Certificates: []tls.Certificate{cert},
    45  	}
    46  
    47  	logger, recorder := floggingtest.NewTestLogger(t)
    48  
    49  	creds := comm.NewServerTransportCredentials(tlsConfig, logger)
    50  	_, _, err = creds.ClientHandshake(context.Background(), "", nil)
    51  	assert.EqualError(t, err, comm.ErrClientHandshakeNotImplemented.Error())
    52  	err = creds.OverrideServerName("")
    53  	assert.EqualError(t, err, comm.ErrOverrideHostnameNotSupported.Error())
    54  	clone := creds.Clone()
    55  	assert.Equal(t, creds, clone)
    56  	assert.Equal(t, "1.2", creds.Info().SecurityVersion)
    57  	assert.Equal(t, "tls", creds.Info().SecurityProtocol)
    58  
    59  	lis, err := net.Listen("tcp", "localhost:0")
    60  	if err != nil {
    61  		t.Fatalf("failed to start listener [%s]", err)
    62  	}
    63  	defer lis.Close()
    64  
    65  	_, port, err := net.SplitHostPort(lis.Addr().String())
    66  	assert.NoError(t, err)
    67  	addr := net.JoinHostPort("localhost", port)
    68  
    69  	handshake := func(wg *sync.WaitGroup) {
    70  		defer wg.Done()
    71  		conn, err := lis.Accept()
    72  		if err != nil {
    73  			t.Logf("failed to accept connection [%s]", err)
    74  		}
    75  		_, _, err = creds.ServerHandshake(conn)
    76  		if err != nil {
    77  			t.Logf("ServerHandshake error [%s]", err)
    78  		}
    79  	}
    80  
    81  	wg := &sync.WaitGroup{}
    82  	wg.Add(1)
    83  	go handshake(wg)
    84  	_, err = tls.Dial("tcp", addr, &tls.Config{RootCAs: certPool})
    85  	wg.Wait()
    86  	assert.NoError(t, err)
    87  
    88  	wg = &sync.WaitGroup{}
    89  	wg.Add(1)
    90  	go handshake(wg)
    91  	_, err = tls.Dial("tcp", addr, &tls.Config{
    92  		RootCAs:    certPool,
    93  		MaxVersion: tls.VersionTLS10,
    94  	})
    95  	wg.Wait()
    96  	assert.Contains(t, err.Error(), "protocol version not supported")
    97  	assert.Contains(t, recorder.Messages()[0], "TLS handshake failed with error")
    98  }