@@ -203,6 +203,7 @@ absl::StatusOr<int> DefaultCertValidator::initializeSslContexts(std::vector<SSL_
203203bool DefaultCertValidator::verifyCertAndUpdateStatus (
204204 X509* leaf_cert, absl::string_view sni,
205205 const Network::TransportSocketOptions* transport_socket_options,
206+ const CertValidator::ExtraValidationContext& validation_context,
206207 Envoy::Ssl::ClientValidationStatus& detailed_status, std::string* error_details,
207208 uint8_t * out_alert) {
208209
@@ -218,9 +219,13 @@ bool DefaultCertValidator::verifyCertAndUpdateStatus(
218219 match_sni_san.emplace_back (std::make_unique<DnsExactStringSanMatcher>(sni));
219220 match_san_override = match_sni_san;
220221 }
221- Envoy::Ssl::ClientValidationStatus validated = verifyCertificate (
222- leaf_cert, verify_san_override.value_or (std::vector<std::string>()),
223- match_san_override.value_or (subject_alt_name_matchers_), error_details, out_alert);
222+ Envoy::Ssl::ClientValidationStatus validated =
223+ verifyCertificate (leaf_cert, verify_san_override.value_or (std::vector<std::string>()),
224+ match_san_override.value_or (subject_alt_name_matchers_),
225+ validation_context.callbacks != nullptr
226+ ? makeOptRef (validation_context.callbacks ->connection ().streamInfo ())
227+ : absl::nullopt ,
228+ error_details, out_alert);
224229
225230 if (detailed_status == Envoy::Ssl::ClientValidationStatus::NotValidated ||
226231 validated != Envoy::Ssl::ClientValidationStatus::NotValidated) {
@@ -241,6 +246,7 @@ bool DefaultCertValidator::verifyCertAndUpdateStatus(
241246Envoy::Ssl::ClientValidationStatus
242247DefaultCertValidator::verifyCertificate (X509* cert, const std::vector<std::string>& verify_san_list,
243248 const std::vector<SanMatcherPtr>& subject_alt_name_matchers,
249+ OptRef<const StreamInfo::StreamInfo> stream_info,
244250 std::string* error_details, uint8_t * out_alert) {
245251 Envoy::Ssl::ClientValidationStatus validated = Envoy::Ssl::ClientValidationStatus::NotValidated;
246252 if (!verify_san_list.empty ()) {
@@ -257,7 +263,7 @@ DefaultCertValidator::verifyCertificate(X509* cert, const std::vector<std::strin
257263 }
258264
259265 if (!subject_alt_name_matchers.empty ()) {
260- if (!matchSubjectAltName (cert, subject_alt_name_matchers)) {
266+ if (!matchSubjectAltName (cert, stream_info, subject_alt_name_matchers)) {
261267 const char * error = " verify cert failed: SAN matcher" ;
262268 if (error_details != nullptr ) {
263269 *error_details = error;
@@ -299,7 +305,7 @@ DefaultCertValidator::verifyCertificate(X509* cert, const std::vector<std::strin
299305ValidationResults DefaultCertValidator::doVerifyCertChain (
300306 STACK_OF (X509)& cert_chain, Ssl::ValidateResultCallbackPtr /* callback*/ ,
301307 const Network::TransportSocketOptionsConstSharedPtr& transport_socket_options, SSL_CTX& ssl_ctx,
302- const CertValidator::ExtraValidationContext& /* validation_context */ , bool is_server,
308+ const CertValidator::ExtraValidationContext& context , bool is_server,
303309 absl::string_view host_name) {
304310 if (sk_X509_num (&cert_chain) == 0 ) {
305311 stats_.fail_verify_error_ .inc ();
@@ -352,7 +358,7 @@ ValidationResults DefaultCertValidator::doVerifyCertChain(
352358 std::string error_details;
353359 uint8_t tls_alert = SSL_AD_CERTIFICATE_UNKNOWN;
354360 const bool succeeded =
355- verifyCertAndUpdateStatus (leaf_cert, host_name, transport_socket_options.get (),
361+ verifyCertAndUpdateStatus (leaf_cert, host_name, transport_socket_options.get (), context,
356362 detailed_status, &error_details, &tls_alert);
357363 return succeeded ? ValidationResults{ValidationResults::ValidationStatus::Successful,
358364 detailed_status, absl::nullopt , absl::nullopt }
@@ -380,15 +386,20 @@ bool DefaultCertValidator::verifySubjectAltName(X509* cert,
380386}
381387
382388bool DefaultCertValidator::matchSubjectAltName (
383- X509* cert, const std::vector<SanMatcherPtr>& subject_alt_name_matchers) {
389+ X509* cert, OptRef<const StreamInfo::StreamInfo> stream_info,
390+ const std::vector<SanMatcherPtr>& subject_alt_name_matchers) {
384391 bssl::UniquePtr<GENERAL_NAMES> san_names (
385392 static_cast <GENERAL_NAMES*>(X509_get_ext_d2i (cert, NID_subject_alt_name, nullptr , nullptr )));
386393 if (san_names == nullptr ) {
387394 return false ;
388395 }
389396 for (const auto & config_san_matcher : subject_alt_name_matchers) {
390397 for (const GENERAL_NAME* general_name : san_names.get ()) {
391- if (config_san_matcher->match (general_name)) {
398+ if (stream_info) {
399+ if (config_san_matcher->match (general_name, stream_info.ref ())) {
400+ return true ;
401+ }
402+ } else if (config_san_matcher->match (general_name)) {
392403 return true ;
393404 }
394405 }
0 commit comments