ssl - 如何在 Netty Handler 中获取客户端证书来识别用户?

标签 ssl certificate netty

我成功地使用 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/

相关文章:

java - 为什么 TLS 1.0 客户端和 SSL 3.0 服务器之间的握手失败?

php - WordPress 网站签名显示 "not secured"

iphone - 如何为另一台 Mac 设置 iPhone 开发证书

带有 SSL 和 Postman 的 java.nio.channels.ClosedChannelException

java - 如何配置使用Netty的服务器发送UDP数据包的源端口?

mongodb - 让我们在 nginx 上使用 mongod 加密 ssl 更新的 cron 作业

java - 使用 XFire 通过 ssl 使用 Web 服务

ios - Appcenter iOS安装错误 "this app cannot be installed because its integrity could not be verified"

javascript - 该解决方案可以安全地通过 webSoket 通信在网络上访问用户的私有(private)证书吗?

java - Apache Mina SSHD 端口转发,如 NGROK