据我所知,我没有“标志”或配置设置可用于在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
...
我只是想确保我在这里走上正轨,并且我不会错过一种简单地“启用”主机名验证的方法。
答案 0 :(得分:4)
如果您使用的是Java 7,则可以通过配置SSLSocket
或SSLEngine
来通过默认信任管理器为您执行此操作。 (这与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地址条目。)