如何为 nimbus JWKS ResourceRetriever 禁用主机名验证

How to disable Host name verification for nimbus JWKS ResourceRetriever

首先,我使用的是 'DefaultResourceRetriever',没有像这样的任何配置:

new DefaultResourceRetriever(1000, 1000);

然后我得到以下异常

java.security.cert.CertificateException: No subject alternative DNS name matching my-jwks-url.com found.

为了绕过证书检查,我配置了资源检索器,如下所示;

TrustStrategy trustStrategy = (X509Certificate[] x509Certificates, String s) -> true;

SSLContext sslContext = SSLContexts.custom()
    .loadTrustMaterial(null, trustStrategy)
    .build();

SSLSocketFactory socketFactory = sslContext.getSocketFactory();

return new DefaultResourceRetriever(1000, 1000, 0, true, socketFactory);

但它并没有改变任何东西。

我可以将主机名验证程序设置为 SSLConnectionSocketFactory,如下所示:

new SSLConnectionSocketFactory(sslContext, new NoopHostnameVerifier()) 但是 nimbus ResourceRetriever 只接受 SSLSocketFactory 作为参数。

有什么方法可以禁用主机名验证吗?

我通过扩展 DefaultResourceRetriever 并覆盖 openConnection(URL url) 方法解决了这个问题。

如果 URL 是 HTTPS,它会创建 HttpsURLConnection。我们可以将 NoopH​​ostnameVerifier 设置为它。

这是我的解决方案:

public class NoopHostnameVerifyingResourceRetriever extends DefaultResourceRetriever {
    
      public NoopHostnameVerifyingResourceRetriever(int connectTimeout, int readTimeout) {
        super(connectTimeout, readTimeout);
      }
    
      @Override
      protected HttpURLConnection openConnection(URL url) throws IOException {
        HttpURLConnection connection = super.openConnection(url);
    
        if (connection instanceof HttpsURLConnection) {
          ((HttpsURLConnection) connection).setHostnameVerifier(new NoopHostnameVerifier());
        }
    
        return connection;
      }
}