2012-03-19 174 views
4

我使用双向SSL成功运行Netty(请参阅Set up Netty with 2-way SSL Handsake (client and server certificate))。如何获取Netty Handler中的客户端证书以识别用户?

但是,在我的一些处理程序中,我需要了解使用该应用程序的用户。我发现我无法弄清楚如何在我的处理程序中获取用户证书DN等信息。

我认为它可以在ChannelHandlerContext的某个地方使用,但事实并非如此。有什么建议么?

我知道SSLEngine有权访问它,但我没有看到任何有关在SSLEngine公共API中获取访问权的信息。我知道它在握手操作中有访问权限......但我怎么得到它?

回答

7

SSLEngine.getSession().getPeerCertificateChain()。第零个条目是对等体自己的证书。

+0

这确实解决问题。谢谢! – CStepnitz 2012-03-20 19:50:32

+0

玩!框架在其后台使用netty,我想要SSL客户端证书,我怎么能得到当前的SSLEngine? – 2012-06-23 21:14:00

8

SSLEngine只是可以通过Pipline/ChannelHandlerContext

ChannelHandlerContext ctx = ... 
SslHandler sslhandler = (SslHandler) ctx.channel().pipeline().get("ssl"); 
sslhandler.engine().getSession().getPeerCertificateChain()[0].getSubjectDN()); 

中获取这可以让你获得证书的处理程序对象。请注意,当你这样做时,SSL握手需要完成。否则您将获得一个

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 

异常。为了避免这种情况,你可以听在处理程序userEvent(在我们的例子HandshakeCompletionEvent),这可能如下:

@Override 
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) { 
    logger.info("userEventTriggered: {0}, Class: {1}", evt.toString(), evt.getClass()); 

    if (evt instanceof HandshakeCompletionEvent) { 
     fetchCertificate(ctx); 
    } 
}