1

据我所知,没有“标志”或配置设置可用于在 Netty 中启用 SSL 主机名验证。我见过的示例使用 SslHandler.handshake() 返回的 ChannelFuture 添加自定义实现:

ChannelFuture handshakeFuture = sslHandler.handshake();
handshakeFuture.addListener(new ChannelFutureListener()
{
    public void operationComplete(ChannelFuture future) throws Exception
    {
        if (future.isSuccess())
        {
            // get peer certs, verify CN (or SAN extension, or..?) against requested domain
            ...

我只是想确保我在正确的轨道上,并且我没有错过一种简单地“启用”主机名验证的方法。

4

1 回答 1

4

如果您使用的是 Java 7,则可以通过配置SSLSocketSSLEngine通过默认信任管理器为您执行此操作。(这与 Netty 无关。)

像这样的东西应该工作:

SSLContext sslContext = SSLContext.getDefault();
SSLEngine sslEngine = sslContext.createSSLEngine();

SSLParameters sslParams = new SSLParameters();
sslParams.setEndpointIdentificationAlgorithm("HTTPS");
sslEngine.setSSLParameters(sslParams);

SSLEngine实例可以作为参数传递给SslHandler构造函数,如本中所述。

端点识别算法可以是 HTTPS 或 LDAP。对于其他协议,HTTPS 规则应该是相当合理的。

(您当然可以通过使用错误的主机名连接到该主机来检查它是否有效,例如使用带有 IP 地址而不是主机名的 URL,假设证书不包含主题备用名称 IP 地址条目为了它。)

于 2012-11-09T21:25:38.633 回答