| // | |
| // Copyright 2020 gRPC authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| // | |
| #include <memory> | |
| #include <gmock/gmock.h> | |
| #include <gtest/gtest.h> | |
| #include <grpc/grpc.h> | |
| #include <grpc/grpc_security.h> | |
| #include <grpcpp/security/server_credentials.h> | |
| #include <grpcpp/security/tls_credentials_options.h> | |
| #include "src/cpp/client/secure_credentials.h" | |
| #include "test/core/util/port.h" | |
| #include "test/core/util/test_config.h" | |
| #include "test/cpp/util/tls_test_utils.h" | |
| #define CA_CERT_PATH "src/core/tsi/test_creds/ca.pem" | |
| #define SERVER_CERT_PATH "src/core/tsi/test_creds/server1.pem" | |
| #define SERVER_KEY_PATH "src/core/tsi/test_creds/server1.key" | |
| #define CRL_DIR_PATH "test/core/tsi/test_creds/crl_data/crls" | |
| namespace { | |
| constexpr const char* kRootCertName = "root_cert_name"; | |
| constexpr const char* kRootCertContents = "root_cert_contents"; | |
| constexpr const char* kIdentityCertName = "identity_cert_name"; | |
| constexpr const char* kIdentityCertPrivateKey = "identity_private_key"; | |
| constexpr const char* kIdentityCertContents = "identity_cert_contents"; | |
| using ::grpc::experimental::ExternalCertificateVerifier; | |
| using ::grpc::experimental::FileWatcherCertificateProvider; | |
| using ::grpc::experimental::StaticDataCertificateProvider; | |
| } // namespace | |
| namespace grpc { | |
| namespace testing { | |
| namespace { | |
| TEST( | |
| CredentialsTest, | |
| TlsServerCredentialsWithStaticDataCertificateProviderLoadingRootAndIdentity) { | |
| experimental::IdentityKeyCertPair key_cert_pair; | |
| key_cert_pair.private_key = kIdentityCertPrivateKey; | |
| key_cert_pair.certificate_chain = kIdentityCertContents; | |
| std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs; | |
| identity_key_cert_pairs.emplace_back(key_cert_pair); | |
| auto certificate_provider = std::make_shared<StaticDataCertificateProvider>( | |
| kRootCertContents, identity_key_cert_pairs); | |
| grpc::experimental::TlsServerCredentialsOptions options(certificate_provider); | |
| options.watch_root_certs(); | |
| options.set_root_cert_name(kRootCertName); | |
| options.watch_identity_key_cert_pairs(); | |
| options.set_identity_cert_name(kIdentityCertName); | |
| options.set_cert_request_type( | |
| GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); | |
| auto server_credentials = grpc::experimental::TlsServerCredentials(options); | |
| GPR_ASSERT(server_credentials.get() != nullptr); | |
| } | |
| // ServerCredentials should always have identity credential presented. | |
| // Otherwise gRPC stack will fail. | |
| TEST(CredentialsTest, | |
| TlsServerCredentialsWithStaticDataCertificateProviderLoadingIdentityOnly) { | |
| experimental::IdentityKeyCertPair key_cert_pair; | |
| key_cert_pair.private_key = kIdentityCertPrivateKey; | |
| key_cert_pair.certificate_chain = kIdentityCertContents; | |
| std::vector<experimental::IdentityKeyCertPair> identity_key_cert_pairs; | |
| // Adding two key_cert_pair(s) should still work. | |
| identity_key_cert_pairs.emplace_back(key_cert_pair); | |
| identity_key_cert_pairs.emplace_back(key_cert_pair); | |
| auto certificate_provider = | |
| std::make_shared<StaticDataCertificateProvider>(identity_key_cert_pairs); | |
| grpc::experimental::TlsServerCredentialsOptions options(certificate_provider); | |
| options.watch_identity_key_cert_pairs(); | |
| options.set_identity_cert_name(kIdentityCertName); | |
| options.set_cert_request_type( | |
| GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); | |
| auto server_credentials = grpc::experimental::TlsServerCredentials(options); | |
| GPR_ASSERT(server_credentials.get() != nullptr); | |
| } | |
| TEST( | |
| CredentialsTest, | |
| TlsServerCredentialsWithFileWatcherCertificateProviderLoadingRootAndIdentity) { | |
| auto certificate_provider = std::make_shared<FileWatcherCertificateProvider>( | |
| SERVER_KEY_PATH, SERVER_CERT_PATH, CA_CERT_PATH, 1); | |
| grpc::experimental::TlsServerCredentialsOptions options(certificate_provider); | |
| options.watch_root_certs(); | |
| options.set_root_cert_name(kRootCertName); | |
| options.watch_identity_key_cert_pairs(); | |
| options.set_identity_cert_name(kIdentityCertName); | |
| options.set_cert_request_type( | |
| GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); | |
| auto server_credentials = grpc::experimental::TlsServerCredentials(options); | |
| GPR_ASSERT(server_credentials.get() != nullptr); | |
| } | |
| TEST(CredentialsTest, TlsServerCredentialsWithCrlChecking) { | |
| auto certificate_provider = std::make_shared<FileWatcherCertificateProvider>( | |
| SERVER_KEY_PATH, SERVER_CERT_PATH, CA_CERT_PATH, 1); | |
| grpc::experimental::TlsServerCredentialsOptions options(certificate_provider); | |
| options.watch_root_certs(); | |
| options.set_root_cert_name(kRootCertName); | |
| options.watch_identity_key_cert_pairs(); | |
| options.set_identity_cert_name(kIdentityCertName); | |
| options.set_cert_request_type( | |
| GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); | |
| options.set_crl_directory(CRL_DIR_PATH); | |
| auto server_credentials = grpc::experimental::TlsServerCredentials(options); | |
| GPR_ASSERT(server_credentials.get() != nullptr); | |
| } | |
| // ServerCredentials should always have identity credential presented. | |
| // Otherwise gRPC stack will fail. | |
| TEST( | |
| CredentialsTest, | |
| TlsServerCredentialsWithFileWatcherCertificateProviderLoadingIdentityOnly) { | |
| auto certificate_provider = std::make_shared<FileWatcherCertificateProvider>( | |
| SERVER_KEY_PATH, SERVER_CERT_PATH, 1); | |
| grpc::experimental::TlsServerCredentialsOptions options(certificate_provider); | |
| options.watch_identity_key_cert_pairs(); | |
| options.set_identity_cert_name(kIdentityCertName); | |
| options.set_cert_request_type( | |
| GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); | |
| auto server_credentials = grpc::experimental::TlsServerCredentials(options); | |
| GPR_ASSERT(server_credentials.get() != nullptr); | |
| } | |
| TEST(CredentialsTest, TlsServerCredentialsWithSyncExternalVerifier) { | |
| auto verifier = | |
| ExternalCertificateVerifier::Create<SyncCertificateVerifier>(true); | |
| auto certificate_provider = std::make_shared<FileWatcherCertificateProvider>( | |
| SERVER_KEY_PATH, SERVER_CERT_PATH, CA_CERT_PATH, 1); | |
| grpc::experimental::TlsServerCredentialsOptions options(certificate_provider); | |
| options.watch_root_certs(); | |
| options.set_root_cert_name(kRootCertName); | |
| options.watch_identity_key_cert_pairs(); | |
| options.set_identity_cert_name(kIdentityCertName); | |
| options.set_cert_request_type( | |
| GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); | |
| options.set_certificate_verifier(verifier); | |
| auto server_credentials = grpc::experimental::TlsServerCredentials(options); | |
| GPR_ASSERT(server_credentials.get() != nullptr); | |
| } | |
| TEST(CredentialsTest, TlsServerCredentialsWithAsyncExternalVerifier) { | |
| auto verifier = | |
| ExternalCertificateVerifier::Create<AsyncCertificateVerifier>(true); | |
| auto certificate_provider = std::make_shared<FileWatcherCertificateProvider>( | |
| SERVER_KEY_PATH, SERVER_CERT_PATH, CA_CERT_PATH, 1); | |
| grpc::experimental::TlsServerCredentialsOptions options(certificate_provider); | |
| options.watch_root_certs(); | |
| options.set_root_cert_name(kRootCertName); | |
| options.watch_identity_key_cert_pairs(); | |
| options.set_identity_cert_name(kIdentityCertName); | |
| options.set_cert_request_type( | |
| GRPC_SSL_REQUEST_AND_REQUIRE_CLIENT_CERTIFICATE_AND_VERIFY); | |
| options.set_certificate_verifier(verifier); | |
| auto server_credentials = grpc::experimental::TlsServerCredentials(options); | |
| GPR_ASSERT(server_credentials.get() != nullptr); | |
| } | |
| } // namespace | |
| } // namespace testing | |
| } // namespace grpc | |
| int main(int argc, char** argv) { | |
| ::testing::InitGoogleTest(&argc, argv); | |
| grpc::testing::TestEnvironment env(&argc, argv); | |
| int ret = RUN_ALL_TESTS(); | |
| return ret; | |
| } |