如何为 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。我们可以将 NoopHostnameVerifier 设置为它。
这是我的解决方案:
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;
}
}
首先,我使用的是 '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。我们可以将 NoopHostnameVerifier 设置为它。
这是我的解决方案:
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;
}
}