我成功地使用 2-way SSL 运行 Netty(参见 Set up Netty with 2-way SSL Handsake (client and server certificate))。
但是,在我的一些处理程序中,我需要了解正在使用该应用程序的用户。我发现我不知道如何在我的处理程序中获取用户证书 DN 等信息。
我认为它可以在 ChannelHandlerContext 的某个地方使用,但事实并非如此。有什么建议吗?
我知道 SSLEngine 可以在某处访问它,但我没有看到任何有关在 SSLEngine 公共(public) API 中获取访问权限的信息。我知道它在握手操作中具有访问权限....但我如何获得它?
最佳答案
可以通过 Pipline/ChannelHandlerContext 获取 SSLEngine
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);
}
}
关于ssl - 如何在 Netty Handler 中获取客户端证书来识别用户?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9777864/