xds_certificate_provider.h
Go to the documentation of this file.
1 //
2 //
3 // Copyright 2020 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 
19 #ifndef GRPC_CORE_EXT_XDS_XDS_CERTIFICATE_PROVIDER_H
20 #define GRPC_CORE_EXT_XDS_XDS_CERTIFICATE_PROVIDER_H
21 
23 
24 #include <map>
25 #include <memory>
26 #include <string>
27 #include <vector>
28 
29 #include "absl/base/thread_annotations.h"
30 #include "absl/strings/string_view.h"
31 
32 #include <grpc/grpc_security.h>
34 
42 
43 #define GRPC_ARG_XDS_CERTIFICATE_PROVIDER \
44  "grpc.internal.xds_certificate_provider"
45 
46 namespace grpc_core {
47 
49  public:
51  ~XdsCertificateProvider() override;
52 
54  return distributor_;
55  }
56 
57  UniqueTypeName type() const override;
58 
59  bool ProvidesRootCerts(const std::string& cert_name);
61  const std::string& cert_name, absl::string_view root_cert_name,
63 
64  bool ProvidesIdentityCerts(const std::string& cert_name);
66  const std::string& cert_name, absl::string_view identity_cert_name,
68  identity_cert_distributor);
69 
70  bool GetRequireClientCertificate(const std::string& cert_name);
71  // Updating \a require_client_certificate for a non-existing \a cert_name has
72  // no effect.
73  void UpdateRequireClientCertificate(const std::string& cert_name,
74  bool require_client_certificate);
75 
76  std::vector<StringMatcher> GetSanMatchers(const std::string& cluster);
78  const std::string& cluster, std::vector<StringMatcher> matchers);
79 
80  grpc_arg MakeChannelArg() const;
81 
83  const grpc_channel_args* args);
84 
85  private:
87  public:
89  XdsCertificateProvider* xds_certificate_provider)
90  : xds_certificate_provider_(xds_certificate_provider) {}
91 
93 
94  // Returns true if the certs aren't being watched and there are no
95  // distributors configured.
96  bool IsSafeToRemove() const;
97 
98  bool ProvidesRootCerts() const { return root_cert_distributor_ != nullptr; }
99  bool ProvidesIdentityCerts() const {
100  return identity_cert_distributor_ != nullptr;
101  }
102 
104  const std::string& cert_name, absl::string_view root_cert_name,
107  const std::string& cert_name, absl::string_view identity_cert_name,
109  identity_cert_distributor);
110 
112  const std::string& cert_name,
113  grpc_tls_certificate_distributor* root_cert_distributor);
115  const std::string& cert_name,
116  grpc_tls_certificate_distributor* identity_cert_distributor);
117 
120  }
123  }
124 
125  void WatchStatusCallback(const std::string& cert_name,
126  bool root_being_watched,
127  bool identity_being_watched);
128 
129  private:
131  bool watching_root_certs_ = false;
142  };
143 
144  int CompareImpl(const grpc_tls_certificate_provider* other) const override {
145  // TODO(yashykt): Maybe do something better here.
146  return QsortCompare(static_cast<const grpc_tls_certificate_provider*>(this),
147  other);
148  }
149 
150  void WatchStatusCallback(std::string cert_name, bool root_being_watched,
151  bool identity_being_watched);
152 
154 
156  std::map<std::string /*cert_name*/, std::unique_ptr<ClusterCertificateState>>
157  certificate_state_map_ ABSL_GUARDED_BY(mu_);
158 
159  // Use a separate mutex for san_matchers_ to avoid deadlocks since
160  // san_matchers_ needs to be accessed when a handshake is being done and we
161  // run into a possible deadlock scenario if using the same mutex. The mutex
162  // deadlock cycle is formed as -
163  // WatchStatusCallback() -> SetKeyMaterials() ->
164  // TlsChannelSecurityConnector::TlsChannelCertificateWatcher::OnCertificatesChanged()
165  // -> HandshakeManager::Add() -> SecurityHandshaker::DoHandshake() ->
166  // subject_alternative_names_matchers()
168  std::map<std::string /*cluster_name*/, std::vector<StringMatcher>>
169  san_matcher_map_ ABSL_GUARDED_BY(san_matchers_mu_);
170 };
171 
172 } // namespace grpc_core
173 
174 #endif // GRPC_CORE_EXT_XDS_XDS_CERTIFICATE_PROVIDER_H
grpc_arg
Definition: grpc_types.h:103
grpc_core::XdsCertificateProvider::ClusterCertificateState::IsSafeToRemove
bool IsSafeToRemove() const
Definition: xds_certificate_provider.cc:126
grpc_core::XdsCertificateProvider::ClusterCertificateState::set_require_client_certificate
void set_require_client_certificate(bool require_client_certificate)
Definition: xds_certificate_provider.h:121
grpc_core::XdsCertificateProvider::mu_
Mutex mu_
Definition: xds_certificate_provider.h:155
grpc_tls_certificate_distributor.h
grpc_core::XdsCertificateProvider::ClusterCertificateState::watching_identity_certs_
bool watching_identity_certs_
Definition: xds_certificate_provider.h:132
grpc_core::XdsCertificateProvider::ClusterCertificateState::identity_cert_distributor_
RefCountedPtr< grpc_tls_certificate_distributor > identity_cert_distributor_
Definition: xds_certificate_provider.h:136
grpc_core::XdsCertificateProvider::ClusterCertificateState::watching_root_certs_
bool watching_root_certs_
Definition: xds_certificate_provider.h:131
grpc_core::XdsCertificateProvider::UpdateRootCertNameAndDistributor
void UpdateRootCertNameAndDistributor(const std::string &cert_name, absl::string_view root_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > root_cert_distributor)
Definition: xds_certificate_provider.cc:287
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateRootCertWatcher
void UpdateRootCertWatcher(const std::string &cert_name, grpc_tls_certificate_distributor *root_cert_distributor)
Definition: xds_certificate_provider.cc:191
grpc_core
Definition: call_metric_recorder.h:31
grpc_core::XdsCertificateProvider::distributor
RefCountedPtr< grpc_tls_certificate_distributor > distributor() const override
Definition: xds_certificate_provider.h:53
absl::string_view
Definition: abseil-cpp/absl/strings/string_view.h:167
matchers
XdsRouteConfigResource::Route::Matchers matchers
Definition: xds_server_config_fetcher.cc:317
useful.h
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
grpc_core::XdsCertificateProvider::ClusterCertificateState::root_cert_watcher_
grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface * root_cert_watcher_
Definition: xds_certificate_provider.h:138
grpc_core::XdsCertificateProvider::ClusterCertificateState::identity_cert_name_
std::string identity_cert_name_
Definition: xds_certificate_provider.h:134
grpc_core::XdsCertificateProvider::GetRequireClientCertificate
bool GetRequireClientCertificate(const std::string &cert_name)
Definition: xds_certificate_provider.cc:329
grpc_tls_certificate_distributor
Definition: grpc_tls_certificate_distributor.h:43
grpc_core::XdsCertificateProvider::ProvidesRootCerts
bool ProvidesRootCerts(const std::string &cert_name)
Definition: xds_certificate_provider.cc:280
grpc_security.h
grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface
Definition: grpc_tls_certificate_distributor.h:47
map
zval * map
Definition: php/ext/google/protobuf/encode_decode.c:480
grpc_channel_args
Definition: grpc_types.h:132
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateRootCertNameAndDistributor
void UpdateRootCertNameAndDistributor(const std::string &cert_name, absl::string_view root_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > root_cert_distributor)
Definition: xds_certificate_provider.cc:133
grpc_types.h
grpc_core::XdsCertificateProvider::ClusterCertificateState::require_client_certificate_
bool require_client_certificate_
Definition: xds_certificate_provider.h:141
grpc_core::XdsCertificateProvider::GetFromChannelArgs
static RefCountedPtr< XdsCertificateProvider > GetFromChannelArgs(const grpc_channel_args *args)
Definition: xds_certificate_provider.cc:411
grpc_tls_certificate_provider.h
asyncio_get_stats.args
args
Definition: asyncio_get_stats.py:40
grpc_core::XdsCertificateProvider::ClusterCertificateState::~ClusterCertificateState
~ClusterCertificateState()
Definition: xds_certificate_provider.cc:116
grpc_core::RefCountedPtr< grpc_tls_certificate_distributor >
cluster
absl::string_view cluster
Definition: xds_resolver.cc:331
grpc_core::XdsCertificateProvider::ClusterCertificateState::WatchStatusCallback
void WatchStatusCallback(const std::string &cert_name, bool root_being_watched, bool identity_being_watched)
Definition: xds_certificate_provider.cc:211
grpc_core::XdsCertificateProvider::ClusterCertificateState::require_client_certificate
bool require_client_certificate() const
Definition: xds_certificate_provider.h:118
grpc_core::XdsCertificateProvider::ClusterCertificateState::identity_cert_watcher_
grpc_tls_certificate_distributor::TlsCertificatesWatcherInterface * identity_cert_watcher_
Definition: xds_certificate_provider.h:140
grpc_core::XdsCertificateProvider::GetSanMatchers
std::vector< StringMatcher > GetSanMatchers(const std::string &cluster)
Definition: xds_certificate_provider.cc:345
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateIdentityCertNameAndDistributor
void UpdateIdentityCertNameAndDistributor(const std::string &cert_name, absl::string_view identity_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > identity_cert_distributor)
Definition: xds_certificate_provider.cc:162
grpc_core::XdsCertificateProvider::ClusterCertificateState::ProvidesIdentityCerts
bool ProvidesIdentityCerts() const
Definition: xds_certificate_provider.h:99
matchers.h
grpc_core::XdsCertificateProvider::san_matchers_mu_
Mutex san_matchers_mu_
Definition: xds_certificate_provider.h:167
grpc_core::XdsCertificateProvider::ClusterCertificateState::root_cert_name_
std::string root_cert_name_
Definition: xds_certificate_provider.h:133
grpc_core::XdsCertificateProvider::UpdateSubjectAlternativeNameMatchers
void UpdateSubjectAlternativeNameMatchers(const std::string &cluster, std::vector< StringMatcher > matchers)
Definition: xds_certificate_provider.cc:353
grpc_core::XdsCertificateProvider::distributor_
RefCountedPtr< grpc_tls_certificate_distributor > distributor_
Definition: xds_certificate_provider.h:153
grpc_core::XdsCertificateProvider::WatchStatusCallback
void WatchStatusCallback(std::string cert_name, bool root_being_watched, bool identity_being_watched)
Definition: xds_certificate_provider.cc:363
grpc_core::XdsCertificateProvider::~XdsCertificateProvider
~XdsCertificateProvider() override
Definition: xds_certificate_provider.cc:271
grpc_core::XdsCertificateProvider::ClusterCertificateState
Definition: xds_certificate_provider.h:86
grpc_core::XdsCertificateProvider
Definition: xds_certificate_provider.h:48
grpc_core::Mutex
Definition: src/core/lib/gprpp/sync.h:61
grpc_core::XdsCertificateProvider::ClusterCertificateState::UpdateIdentityCertWatcher
void UpdateIdentityCertWatcher(const std::string &cert_name, grpc_tls_certificate_distributor *identity_cert_distributor)
Definition: xds_certificate_provider.cc:201
grpc_core::UniqueTypeName
Definition: unique_type_name.h:56
grpc_core::QsortCompare
int QsortCompare(const T &a, const T &b)
Definition: useful.h:95
grpc_core::XdsCertificateProvider::ClusterCertificateState::ProvidesRootCerts
bool ProvidesRootCerts() const
Definition: xds_certificate_provider.h:98
unique_type_name.h
grpc_core::XdsCertificateProvider::UpdateIdentityCertNameAndDistributor
void UpdateIdentityCertNameAndDistributor(const std::string &cert_name, absl::string_view identity_cert_name, RefCountedPtr< grpc_tls_certificate_distributor > identity_cert_distributor)
Definition: xds_certificate_provider.cc:312
ref_counted_ptr.h
grpc_core::XdsCertificateProvider::UpdateRequireClientCertificate
void UpdateRequireClientCertificate(const std::string &cert_name, bool require_client_certificate)
Definition: xds_certificate_provider.cc:337
grpc_core::XdsCertificateProvider::CompareImpl
int CompareImpl(const grpc_tls_certificate_provider *other) const override
Definition: xds_certificate_provider.h:144
grpc_tls_certificate_provider
Definition: grpc_tls_certificate_provider.h:53
grpc_core::XdsCertificateProvider::XdsCertificateProvider
XdsCertificateProvider()
Definition: xds_certificate_provider.cc:265
grpc_core::XdsCertificateProvider::ClusterCertificateState::xds_certificate_provider_
XdsCertificateProvider * xds_certificate_provider_
Definition: xds_certificate_provider.h:130
grpc_core::XdsCertificateProvider::ABSL_GUARDED_BY
std::map< std::string, std::unique_ptr< ClusterCertificateState > > certificate_state_map_ ABSL_GUARDED_BY(mu_)
grpc_core::XdsCertificateProvider::MakeChannelArg
grpc_arg MakeChannelArg() const
Definition: xds_certificate_provider.cc:404
grpc_core::XdsCertificateProvider::ClusterCertificateState::root_cert_distributor_
RefCountedPtr< grpc_tls_certificate_distributor > root_cert_distributor_
Definition: xds_certificate_provider.h:135
grpc_core::XdsCertificateProvider::type
UniqueTypeName type() const override
Definition: xds_certificate_provider.cc:275
grpc_core::XdsCertificateProvider::ProvidesIdentityCerts
bool ProvidesIdentityCerts(const std::string &cert_name)
Definition: xds_certificate_provider.cc:304
sync.h
grpc_core::XdsCertificateProvider::ClusterCertificateState::ClusterCertificateState
ClusterCertificateState(XdsCertificateProvider *xds_certificate_provider)
Definition: xds_certificate_provider.h:88
port_platform.h


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:57