首页 > 解决方案 > Netty 世界中 .setSSLHostnameVerifier(NoopH​​ostnameVerifier.INSTANCE) 的等价物是什么?

问题描述

关于Netty和的一个小问题io.netty.handler.ssl.SslContext

在 Tomcat 和org.apache.http.ssl.SSLContexts中,我们可以执行以下操作:

HttpClient httpClient = HttpClients.custom() .setSSLContext(SSLContexts.custom() .loadKeyMaterial( someKeystorePropertlyInitialized ) .loadTrustMaterial( someTruststorePropertlyInitialized ) .build( )) .setSSLHostnameVerifier(NoopH​​ostnameVerifier.INSTANCE) .build ();

(赞赏我们是否可以保留字体而不包裹在代码块中)

例如,这可以解决诸如 Caused by: java.security.cert.CertificateException: No subject Alternative DNS name matching xxx found 之类的问题(这个问题不是关于是否NoopHostnameVerifier.INSTANCE是解决此问题的正确方法。)

我的问题是,Netty 中的等价物是什么.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)没有 .trustManager(InsecureTrustManagerFactory.INSTANCE),因为我有一个真正的信任存储,我只想跳过主机名,而不是所有内容

也许有什么reactor.netty.http.client.HttpClient; HttpClient.create()

标签: javanettyreactor-netty

解决方案


实际上,Netty 默认关闭了主机名验证——请参阅这个问题。看起来您正在使用的库(reactor-netty)可能已打开它。reactor-netty 的 github 上似乎存在类似的问题,它指向了解决方案,但提供的代码片段似乎比必要的要多。本质上,您只需要访问SSLEnginefromSslHandler并确保端点识别算法为空/null:

HttpClient.create().secure(
        ssl -> ssl.sslContext(sslContext)
              .handlerConfigurator(handler-> {
                  SSLEngine engine = handler.engine();
                  SSLParameters params = new SSLParameters();
                  // ... set other SSL params
                  params.setEndpointIdentificationAlgorithm(null);
              })
);

推荐阅读