123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- //
- //
- // Copyright 2019 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.
- //
- //
- #ifndef GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H
- #define GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H
- #include <memory>
- #include <vector>
- #include <grpc/grpc_security.h>
- #include <grpc/grpc_security_constants.h>
- #include <grpc/status.h>
- #include <grpc/support/log.h>
- #include <grpcpp/security/tls_certificate_provider.h>
- #include <grpcpp/security/tls_certificate_verifier.h>
- #include <grpcpp/support/config.h>
- namespace grpc {
- namespace experimental {
- // Base class of configurable options specified by users to configure their
- // certain security features supported in TLS. It is used for experimental
- // purposes for now and it is subject to change.
- class TlsCredentialsOptions {
- public:
- // Constructor for base class TlsCredentialsOptions.
- //
- // @param certificate_provider the provider which fetches TLS credentials that
- // will be used in the TLS handshake
- TlsCredentialsOptions();
- // ---- Setters for member fields ----
- // Sets the certificate provider used to store root certs and identity certs.
- void set_certificate_provider(
- std::shared_ptr<CertificateProviderInterface> certificate_provider);
- // Watches the updates of root certificates with name |root_cert_name|.
- // If used in TLS credentials, setting this field is optional for both the
- // client side and the server side.
- // If this is not set on the client side, we will use the root certificates
- // stored in the default system location, since client side must provide root
- // certificates in TLS(no matter single-side TLS or mutual TLS).
- // If this is not set on the server side, we will not watch any root
- // certificate updates, and assume no root certificates needed for the server
- // (in the one-side TLS scenario, the server is not required to provide root
- // certs). We don't support default root certs on server side.
- void watch_root_certs();
- // Sets the name of root certificates being watched, if |watch_root_certs| is
- // called. If not set, an empty string will be used as the name.
- //
- // @param root_cert_name the name of root certs being set.
- void set_root_cert_name(const TString& root_cert_name);
- // Watches the updates of identity key-cert pairs with name
- // |identity_cert_name|. If used in TLS credentials, it is required to be set
- // on the server side, and optional for the client side(in the one-side
- // TLS scenario, the client is not required to provide identity certs).
- void watch_identity_key_cert_pairs();
- // Sets the name of identity key-cert pairs being watched, if
- // |watch_identity_key_cert_pairs| is called. If not set, an empty string will
- // be used as the name.
- //
- // @param identity_cert_name the name of identity key-cert pairs being set.
- void set_identity_cert_name(const TString& identity_cert_name);
- // Sets the Tls session key logging configuration. If not set, tls
- // session key logging is disabled. Note that this should be used only for
- // debugging purposes. It should never be used in a production environment
- // due to security concerns.
- //
- // @param tls_session_key_log_file_path: Path where tls session keys would
- // be logged.
- void set_tls_session_key_log_file_path(
- const TString& tls_session_key_log_file_path);
- // Sets the certificate verifier used to perform post-handshake peer identity
- // checks.
- void set_certificate_verifier(
- std::shared_ptr<CertificateVerifier> certificate_verifier);
- // Sets the options of whether to check the hostname of the peer on a per-call
- // basis. This is usually used in a combination with virtual hosting at the
- // client side, where each individual call on a channel can have a different
- // host associated with it.
- // This check is intended to verify that the host specified for the individual
- // call is covered by the cert that the peer presented.
- // We will perform such checks by default. This should be disabled if
- // verifiers other than the host name verifier is used.
- void set_check_call_host(bool check_call_host);
- // TODO(zhenlian): This is an experimental API is likely to change in the
- // future. Before de-experiementalizing, verify the API is up to date.
- // If set, gRPC will read all hashed x.509 CRL files in the directory and
- // enforce the CRL files on all TLS handshakes. Only supported for OpenSSL
- // version > 1.1.
- void set_crl_directory(const TString& path);
- // ----- Getters for member fields ----
- // Get the internal c options. This function shall be used only internally.
- grpc_tls_credentials_options* c_credentials_options() const {
- return c_credentials_options_;
- }
- private:
- std::shared_ptr<CertificateProviderInterface> certificate_provider_;
- std::shared_ptr<CertificateVerifier> certificate_verifier_;
- grpc_tls_credentials_options* c_credentials_options_ = nullptr;
- };
- // Contains configurable options on the client side.
- // Client side doesn't need to always use certificate provider. When the
- // certificate provider is not set, we will use the root certificates stored
- // in the system default locations, and assume client won't provide any
- // identity certificates(single side TLS).
- // It is used for experimental purposes for now and it is subject to change.
- class TlsChannelCredentialsOptions final : public TlsCredentialsOptions {
- public:
- // Sets the decision of whether to do a crypto check on the server certs.
- // The default is true.
- void set_verify_server_certs(bool verify_server_certs);
- private:
- };
- // Contains configurable options on the server side.
- // It is used for experimental purposes for now and it is subject to change.
- class TlsServerCredentialsOptions final : public TlsCredentialsOptions {
- public:
- // Server side is required to use a provider, because server always needs to
- // use identity certs.
- explicit TlsServerCredentialsOptions(
- std::shared_ptr<CertificateProviderInterface> certificate_provider)
- : TlsCredentialsOptions() {
- set_certificate_provider(certificate_provider);
- }
- // Sets option to request the certificates from the client.
- // The default is GRPC_SSL_DONT_REQUEST_CLIENT_CERTIFICATE.
- void set_cert_request_type(
- grpc_ssl_client_certificate_request_type cert_request_type);
- private:
- };
- } // namespace experimental
- } // namespace grpc
- #endif // GRPCPP_SECURITY_TLS_CREDENTIALS_OPTIONS_H
|