github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/gossip/util/grpc.go (about)

     1  /*
     2  Copyright hechain. All Rights Reserved.
     3  
     4  SPDX-License-Identifier: Apache-2.0
     5  */
     6  
     7  package util
     8  
     9  import (
    10  	"crypto/tls"
    11  	"crypto/x509"
    12  	"fmt"
    13  	"net"
    14  	"strconv"
    15  	"time"
    16  
    17  	"github.com/hechain20/hechain/common/crypto/tlsgen"
    18  	"github.com/hechain20/hechain/gossip/api"
    19  	"github.com/hechain20/hechain/gossip/common"
    20  	"github.com/hechain20/hechain/internal/pkg/comm"
    21  	"google.golang.org/grpc"
    22  	"google.golang.org/grpc/credentials"
    23  )
    24  
    25  // CA that generates TLS key-pairs
    26  var ca = createCAOrPanic()
    27  
    28  func createCAOrPanic() tlsgen.CA {
    29  	ca, err := tlsgen.NewCA()
    30  	if err != nil {
    31  		panic(fmt.Sprintf("failed creating CA: %+v", err))
    32  	}
    33  	return ca
    34  }
    35  
    36  // CreateGRPCLayer returns a new gRPC server with associated port, TLS certificates, SecureDialOpts and DialOption
    37  func CreateGRPCLayer() (port int, gRPCServer *comm.GRPCServer, certs *common.TLSCertificates,
    38  	secureDialOpts api.PeerSecureDialOpts, dialOpts []grpc.DialOption) {
    39  	serverKeyPair, err := ca.NewServerCertKeyPair("127.0.0.1")
    40  	if err != nil {
    41  		panic(err)
    42  	}
    43  	clientKeyPair, err := ca.NewClientCertKeyPair()
    44  	if err != nil {
    45  		panic(err)
    46  	}
    47  
    48  	tlsServerCert, err := tls.X509KeyPair(serverKeyPair.Cert, serverKeyPair.Key)
    49  	if err != nil {
    50  		panic(err)
    51  	}
    52  	tlsClientCert, err := tls.X509KeyPair(clientKeyPair.Cert, clientKeyPair.Key)
    53  	if err != nil {
    54  		panic(err)
    55  	}
    56  
    57  	tlsConf := &tls.Config{
    58  		Certificates: []tls.Certificate{tlsClientCert},
    59  		ClientAuth:   tls.RequestClientCert,
    60  		RootCAs:      x509.NewCertPool(),
    61  	}
    62  
    63  	tlsConf.RootCAs.AppendCertsFromPEM(ca.CertBytes())
    64  
    65  	ta := credentials.NewTLS(tlsConf)
    66  	dialOpts = append(dialOpts, grpc.WithTransportCredentials(ta))
    67  
    68  	secureDialOpts = func() []grpc.DialOption {
    69  		return dialOpts
    70  	}
    71  
    72  	certs = &common.TLSCertificates{}
    73  	certs.TLSServerCert.Store(&tlsServerCert)
    74  	certs.TLSClientCert.Store(&tlsClientCert)
    75  
    76  	srvConfig := comm.ServerConfig{
    77  		ConnectionTimeout: time.Second,
    78  		SecOpts: comm.SecureOptions{
    79  			Key:         serverKeyPair.Key,
    80  			Certificate: serverKeyPair.Cert,
    81  			UseTLS:      true,
    82  		},
    83  	}
    84  	gRPCServer, err = comm.NewGRPCServer("127.0.0.1:", srvConfig)
    85  	if err != nil {
    86  		panic(err)
    87  	}
    88  
    89  	_, portString, err := net.SplitHostPort(gRPCServer.Address())
    90  	if err != nil {
    91  		panic(err)
    92  	}
    93  	portInt, err := strconv.Atoi(portString)
    94  	if err != nil {
    95  		panic(err)
    96  	}
    97  
    98  	return portInt, gRPCServer, certs, secureDialOpts, dialOpts
    99  }