23 #include "absl/strings/string_view.h"
41 bool XdsVerifySubjectAlternativeNames(
42 const char*
const* subject_alternative_names,
43 size_t subject_alternative_names_size,
44 const std::vector<StringMatcher>&
matchers) {
46 for (
size_t i = 0;
i < subject_alternative_names_size; ++
i) {
47 for (
const auto& matcher :
matchers) {
56 matcher.string_matcher())) {
60 if (matcher.Match(subject_alternative_names[i])) {
85 if (!XdsVerifySubjectAlternativeNames(
86 request->peer_info.san_names.uri_names,
87 request->peer_info.san_names.uri_names_size,
89 !XdsVerifySubjectAlternativeNames(
90 request->peer_info.san_names.ip_names,
91 request->peer_info.san_names.ip_names_size,
93 !XdsVerifySubjectAlternativeNames(
94 request->peer_info.san_names.dns_names,
95 request->peer_info.san_names.dns_names_size,
99 "SANs from certificate did not match SANs from xDS control plane");
111 if (
r != 0)
return r;
121 const char*
const* subject_alternative_names,
122 size_t subject_alternative_names_size,
123 const std::vector<StringMatcher>&
matchers) {
124 return XdsVerifySubjectAlternativeNames(
125 subject_alternative_names, subject_alternative_names_size,
matchers);
132 RefCountedPtr<grpc_channel_security_connector>
136 struct ChannelArgsDeleter {
139 ~ChannelArgsDeleter() {
143 ChannelArgsDeleter temp_args{
args,
false};
148 const_cast<char*
>(target_name));
152 args, &override_arg_name, 1, &override_arg, 1);
153 temp_args.owned =
true;
156 auto xds_certificate_provider =
158 if (xds_certificate_provider !=
nullptr) {
162 const bool watch_root =
163 xds_certificate_provider->ProvidesRootCerts(
cluster_name);
164 const bool watch_identity =
165 xds_certificate_provider->ProvidesIdentityCerts(
cluster_name);
166 if (watch_root || watch_identity) {
167 auto tls_credentials_options =
168 MakeRefCounted<grpc_tls_credentials_options>();
169 tls_credentials_options->set_certificate_provider(
170 xds_certificate_provider);
172 tls_credentials_options->set_watch_root_cert(
true);
173 tls_credentials_options->set_root_cert_name(
cluster_name);
175 if (watch_identity) {
176 tls_credentials_options->set_watch_identity_pair(
true);
177 tls_credentials_options->set_identity_cert_name(
cluster_name);
179 tls_credentials_options->set_verify_server_cert(
true);
180 tls_credentials_options->set_certificate_verifier(
181 MakeRefCounted<XdsCertificateVerifier>(xds_certificate_provider,
183 tls_credentials_options->set_check_call_host(
false);
184 auto tls_credentials =
185 MakeRefCounted<TlsCredentials>(
std::move(tls_credentials_options));
186 return tls_credentials->create_security_connector(
206 auto xds_certificate_provider =
209 if (xds_certificate_provider !=
nullptr &&
210 xds_certificate_provider->ProvidesIdentityCerts(
"")) {
211 auto tls_credentials_options =
212 MakeRefCounted<grpc_tls_credentials_options>();
213 tls_credentials_options->set_watch_identity_pair(
true);
214 tls_credentials_options->set_certificate_provider(xds_certificate_provider);
215 if (xds_certificate_provider->ProvidesRootCerts(
"")) {
216 tls_credentials_options->set_watch_root_cert(
true);
217 if (xds_certificate_provider->GetRequireClientCertificate(
"")) {
218 tls_credentials_options->set_cert_request_type(
221 tls_credentials_options->set_cert_request_type(
226 tls_credentials_options->set_cert_request_type(
229 auto tls_credentials = MakeRefCounted<TlsServerCredentials>(
231 return tls_credentials->create_security_connector(
args);