2323import com .google .common .base .Strings ;
2424import com .google .common .collect .ImmutableList ;
2525import com .google .common .collect .ImmutableMap ;
26+ import com .google .common .collect .Lists ;
2627import com .google .re2j .Pattern ;
2728import io .envoyproxy .envoy .extensions .transport_sockets .tls .v3 .CertificateValidationContext ;
2829import io .envoyproxy .envoy .type .matcher .v3 .RegexMatcher ;
3233import java .security .cert .CertificateException ;
3334import java .security .cert .CertificateParsingException ;
3435import java .security .cert .X509Certificate ;
36+ import java .util .ArrayList ;
3537import java .util .Arrays ;
3638import java .util .Collection ;
3739import java .util .HashSet ;
4042import java .util .Map ;
4143import java .util .Set ;
4244import javax .annotation .Nullable ;
45+ import javax .net .ssl .SNIHostName ;
46+ import javax .net .ssl .SNIServerName ;
4347import javax .net .ssl .SSLEngine ;
4448import javax .net .ssl .SSLParameters ;
4549import javax .net .ssl .SSLSocket ;
@@ -61,30 +65,21 @@ final class XdsX509TrustManager extends X509ExtendedTrustManager implements X509
6165 private final X509ExtendedTrustManager delegate ;
6266 private final Map <String , X509ExtendedTrustManager > spiffeTrustMapDelegates ;
6367 private final CertificateValidationContext certContext ;
64- private final String sniForSanMatching ;
6568
6669 XdsX509TrustManager (@ Nullable CertificateValidationContext certContext ,
6770 X509ExtendedTrustManager delegate ) {
68- this (certContext , delegate , null );
69- }
70-
71- XdsX509TrustManager (@ Nullable CertificateValidationContext certContext ,
72- X509ExtendedTrustManager delegate , @ Nullable String sniForSanMatching ) {
7371 checkNotNull (delegate , "delegate" );
7472 this .certContext = certContext ;
7573 this .delegate = delegate ;
7674 this .spiffeTrustMapDelegates = null ;
77- this .sniForSanMatching = sniForSanMatching ;
7875 }
7976
8077 XdsX509TrustManager (@ Nullable CertificateValidationContext certContext ,
81- Map <String , X509ExtendedTrustManager > spiffeTrustMapDelegates ,
82- @ Nullable String sniForSanMatching ) {
78+ Map <String , X509ExtendedTrustManager > spiffeTrustMapDelegates ) {
8379 checkNotNull (spiffeTrustMapDelegates , "spiffeTrustMapDelegates" );
8480 this .spiffeTrustMapDelegates = ImmutableMap .copyOf (spiffeTrustMapDelegates );
8581 this .certContext = certContext ;
8682 this .delegate = null ;
87- this .sniForSanMatching = sniForSanMatching ;
8883 }
8984
9085 private static boolean verifyDnsNameInPattern (
@@ -213,15 +208,10 @@ private static void verifySubjectAltNameInLeaf(
213208 * This is called from various check*Trusted methods.
214209 */
215210 @ VisibleForTesting
216- void verifySubjectAltNameInChain (X509Certificate [] peerCertChain ) throws CertificateException {
211+ void verifySubjectAltNameInChain (X509Certificate [] peerCertChain , List < StringMatcher > verifyList ) throws CertificateException {
217212 if (certContext == null ) {
218213 return ;
219214 }
220- @ SuppressWarnings ("deprecation" ) // gRFC A29 predates match_typed_subject_alt_names
221- List <StringMatcher > verifyList =
222- CertificateUtils .isXdsSniEnabled && !Strings .isNullOrEmpty (sniForSanMatching )
223- ? ImmutableList .of (StringMatcher .newBuilder ().setExact (sniForSanMatching ).build ())
224- : certContext .getMatchSubjectAltNamesList ();
225215 if (verifyList .isEmpty ()) {
226216 return ;
227217 }
@@ -233,24 +223,27 @@ void verifySubjectAltNameInChain(X509Certificate[] peerCertChain) throws Certifi
233223 }
234224
235225 @ Override
226+ @ SuppressWarnings ("deprecation" ) // gRFC A29 predates match_typed_subject_alt_names
236227 public void checkClientTrusted (X509Certificate [] chain , String authType , Socket socket )
237228 throws CertificateException {
238229 chooseDelegate (chain ).checkClientTrusted (chain , authType , socket );
239- verifySubjectAltNameInChain (chain );
230+ verifySubjectAltNameInChain (chain , certContext . getMatchSubjectAltNamesList () );
240231 }
241232
242233 @ Override
234+ @ SuppressWarnings ("deprecation" ) // gRFC A29 predates match_typed_subject_alt_names
243235 public void checkClientTrusted (X509Certificate [] chain , String authType , SSLEngine sslEngine )
244236 throws CertificateException {
245237 chooseDelegate (chain ).checkClientTrusted (chain , authType , sslEngine );
246- verifySubjectAltNameInChain (chain );
238+ verifySubjectAltNameInChain (chain , certContext . getMatchSubjectAltNamesList () );
247239 }
248240
249241 @ Override
242+ @ SuppressWarnings ("deprecation" ) // gRFC A29 predates match_typed_subject_alt_names
250243 public void checkClientTrusted (X509Certificate [] chain , String authType )
251244 throws CertificateException {
252245 chooseDelegate (chain ).checkClientTrusted (chain , authType );
253- verifySubjectAltNameInChain (chain );
246+ verifySubjectAltNameInChain (chain , certContext . getMatchSubjectAltNamesList () );
254247 }
255248
256249 @ Override
@@ -265,7 +258,22 @@ public void checkServerTrusted(X509Certificate[] chain, String authType, Socket
265258 }
266259 }
267260 chooseDelegate (chain ).checkServerTrusted (chain , authType , socket );
268- verifySubjectAltNameInChain (chain );
261+ List <StringMatcher > sniMatchers = null ;
262+ if (CertificateUtils .isXdsSniEnabled ) {
263+ List <SNIServerName > serverNames = ((SSLSocket ) socket ).getSSLParameters ().getServerNames ();
264+ if (serverNames != null ) {
265+ for (SNIServerName name : serverNames ) {
266+ if (name instanceof SNIHostName ) {
267+ sniMatchers = new ArrayList <>();
268+ sniMatchers .add (StringMatcher .newBuilder ().setExact (((SNIHostName ) name ).getAsciiName ()).build ());
269+ }
270+ }
271+ }
272+ }
273+ if (sniMatchers == null ) {
274+ sniMatchers = certContext .getMatchSubjectAltNamesList ();
275+ }
276+ verifySubjectAltNameInChain (chain , sniMatchers );
269277 }
270278
271279 @ Override
0 commit comments