google.golang.org/grpc@v1.72.2/internal/testutils/tls_creds.go (about)

     1  /*
     2   *
     3   * Copyright 2024 gRPC authors.
     4   *
     5   * Licensed under the Apache License, Version 2.0 (the "License");
     6   * you may not use this file except in compliance with the License.
     7   * You may obtain a copy of the License at
     8   *
     9   *     http://www.apache.org/licenses/LICENSE-2.0
    10   *
    11   * Unless required by applicable law or agreed to in writing, software
    12   * distributed under the License is distributed on an "AS IS" BASIS,
    13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    14   * See the License for the specific language governing permissions and
    15   * limitations under the License.
    16   */
    17  
    18  package testutils
    19  
    20  import (
    21  	"crypto/tls"
    22  	"crypto/x509"
    23  	"os"
    24  	"testing"
    25  
    26  	"google.golang.org/grpc/credentials"
    27  	"google.golang.org/grpc/testdata"
    28  )
    29  
    30  // CreateClientTLSCredentials creates client-side TLS transport credentials
    31  // using certificate and key files from testdata/x509 directory.
    32  func CreateClientTLSCredentials(t *testing.T) credentials.TransportCredentials {
    33  	t.Helper()
    34  
    35  	cert, err := tls.LoadX509KeyPair(testdata.Path("x509/client1_cert.pem"), testdata.Path("x509/client1_key.pem"))
    36  	if err != nil {
    37  		t.Fatalf("tls.LoadX509KeyPair(x509/client1_cert.pem, x509/client1_key.pem) failed: %v", err)
    38  	}
    39  	b, err := os.ReadFile(testdata.Path("x509/server_ca_cert.pem"))
    40  	if err != nil {
    41  		t.Fatalf("os.ReadFile(x509/server_ca_cert.pem) failed: %v", err)
    42  	}
    43  	roots := x509.NewCertPool()
    44  	if !roots.AppendCertsFromPEM(b) {
    45  		t.Fatal("Failed to append certificates")
    46  	}
    47  	return credentials.NewTLS(&tls.Config{
    48  		Certificates: []tls.Certificate{cert},
    49  		RootCAs:      roots,
    50  		ServerName:   "x.test.example.com",
    51  	})
    52  }
    53  
    54  // CreateServerTLSCredentials creates server-side TLS transport credentials
    55  // using certificate and key files from testdata/x509 directory.
    56  func CreateServerTLSCredentials(t *testing.T, clientAuth tls.ClientAuthType) credentials.TransportCredentials {
    57  	t.Helper()
    58  
    59  	cert, err := tls.LoadX509KeyPair(testdata.Path("x509/server1_cert.pem"), testdata.Path("x509/server1_key.pem"))
    60  	if err != nil {
    61  		t.Fatalf("tls.LoadX509KeyPair(x509/server1_cert.pem, x509/server1_key.pem) failed: %v", err)
    62  	}
    63  	b, err := os.ReadFile(testdata.Path("x509/client_ca_cert.pem"))
    64  	if err != nil {
    65  		t.Fatalf("os.ReadFile(x509/client_ca_cert.pem) failed: %v", err)
    66  	}
    67  	ca := x509.NewCertPool()
    68  	if !ca.AppendCertsFromPEM(b) {
    69  		t.Fatal("Failed to append certificates")
    70  	}
    71  	return credentials.NewTLS(&tls.Config{
    72  		ClientAuth:   clientAuth,
    73  		Certificates: []tls.Certificate{cert},
    74  		ClientCAs:    ca,
    75  	})
    76  }