2012-11-09 125 views
0

從我所知道的,沒有可用於在Netty中啓用SSL主機名驗證的「標誌」或配置設置。例子我見過添加使用)由SslHandler.handshake(返回的ChannelFuture定製實現:Netty SSL主機名驗證支持

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 
      ... 

我只是想確保我在正確的軌道上,而我絕不錯過辦法簡單地「啓用」主機名驗證。

回答

3

如果您使用的是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地址條目。)

+0

非常感謝您的快速回答。完全合理。而且,總的來說,感謝您在這裏和其他地方發表的所有精彩帖子。你的名字在SSL上隨處可見......我一直非常依賴你的知識和幫助。謝謝!! –

+0

這些算法的名字都記錄在這裏:http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#jssenames –

+0

@bruno你可以去聊天,請http://聊天.stackoverflow.com/rooms/19372/room-for-royi-namir-and-bruno –