Netty SSL主机名验证支持

时间:2012-11-09 20:38:07

标签: ssl netty hostname

据我所知,我没有“标志”或配置设置可用于在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
            ...

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

1 个答案:

答案 0 :(得分: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构造函数,如this example中所述。

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

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