google.golang.org/grpc@v1.74.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  }
    77  
    78  // CreateServerTLSCredentialsCompatibleWithSPIFFE creates server-side TLS
    79  // transport credentials using certificate and key files from the
    80  // testdata/spiffe_end2end directory. These credentials are compatible with the
    81  // SPIFFE trust bundles used on the client side.
    82  func CreateServerTLSCredentialsCompatibleWithSPIFFE(t *testing.T, clientAuth tls.ClientAuthType) credentials.TransportCredentials {
    83  	t.Helper()
    84  
    85  	cert, err := tls.LoadX509KeyPair(testdata.Path("spiffe_end2end/server_spiffe.pem"), testdata.Path("spiffe_end2end/server.key"))
    86  	if err != nil {
    87  		t.Fatalf("tls.LoadX509KeyPair(spiffe_end2end/server_spiffe.pem, spiffe_end2end/server.key) failed: %v", err)
    88  	}
    89  	b, err := os.ReadFile(testdata.Path("spiffe_end2end/ca.pem"))
    90  	if err != nil {
    91  		t.Fatalf("os.ReadFile(spiffe_end2end/ca.pem) failed: %v", err)
    92  	}
    93  	ca := x509.NewCertPool()
    94  	if !ca.AppendCertsFromPEM(b) {
    95  		t.Fatal("Failed to append certificates")
    96  	}
    97  	return credentials.NewTLS(&tls.Config{
    98  		ClientAuth:   clientAuth,
    99  		Certificates: []tls.Certificate{cert},
   100  		ClientCAs:    ca,
   101  	})
   102  }
   103  
   104  // CreateServerTLSCredentialsCompatibleWithSPIFFEChain creates server-side TLS
   105  // transport credentials using a certificate chain and key files from the
   106  // testdata/spiffe_end2end directory. These credentials are compatible with the
   107  // SPIFFE trust bundles used on the client side.
   108  func CreateServerTLSCredentialsCompatibleWithSPIFFEChain(t *testing.T, clientAuth tls.ClientAuthType) credentials.TransportCredentials {
   109  	t.Helper()
   110  
   111  	certs, err := tls.LoadX509KeyPair(testdata.Path("spiffe_end2end/leaf_and_intermediate_chain.pem"), testdata.Path("spiffe_end2end/leaf_signed_by_intermediate.key"))
   112  	if err != nil {
   113  		t.Fatalf("tls.LoadX509KeyPair(spiffe_end2end/leaf_and_intermediate_chain.pem, spiffe_end2end/leaf_signed_by_intermediate.key) failed: %v", err)
   114  	}
   115  	b, err := os.ReadFile(testdata.Path("spiffe_end2end/ca.pem"))
   116  	if err != nil {
   117  		t.Fatalf("os.ReadFile(spiffe_end2end/ca.pem) failed: %v", err)
   118  	}
   119  	ca := x509.NewCertPool()
   120  	if !ca.AppendCertsFromPEM(b) {
   121  		t.Fatal("Failed to append certificates")
   122  	}
   123  	return credentials.NewTLS(&tls.Config{
   124  		ClientAuth:   clientAuth,
   125  		Certificates: []tls.Certificate{certs},
   126  		ClientCAs:    ca,
   127  	})
   128  }
   129  
   130  // CreateServerTLSCredentialsValidSPIFFEButWrongCA creates server-side TLS
   131  // transport credentials using certificate and key files from the
   132  // testdata/spiffe directory rather than the testdata/spiffe_end2end directory.
   133  // These credentials have the expected trust domains and SPIFFE IDs that are
   134  // compatible with testdata/spiffe_end2end client files, but they are signed by
   135  // a different CA and will thus fail the connection.
   136  func CreateServerTLSCredentialsValidSPIFFEButWrongCA(t *testing.T, clientAuth tls.ClientAuthType) credentials.TransportCredentials {
   137  	t.Helper()
   138  
   139  	cert, err := tls.LoadX509KeyPair(testdata.Path("spiffe/server1_spiffe.pem"), testdata.Path("server1.key"))
   140  	if err != nil {
   141  		t.Fatalf("tls.LoadX509KeyPair(spiffe/server1_spiffe.pem, spiffe/server.key) failed: %v", err)
   142  	}
   143  	b, err := os.ReadFile(testdata.Path("spiffe_end2end/ca.pem"))
   144  	if err != nil {
   145  		t.Fatalf("os.ReadFile(spiffe_end2end/ca.pem) failed: %v", err)
   146  	}
   147  	ca := x509.NewCertPool()
   148  	if !ca.AppendCertsFromPEM(b) {
   149  		t.Fatal("Failed to append certificates")
   150  	}
   151  	return credentials.NewTLS(&tls.Config{
   152  		ClientAuth:   clientAuth,
   153  		Certificates: []tls.Certificate{cert},
   154  		ClientCAs:    ca,
   155  	})
   156  }