Java Netty中的双向SSL身份验证
我正在开发一个基于服务器和客户端的应用程序,它需要双向SSL身份验证。(客户端使用SSL证书对服务器进行身份验证,服务器对客户端进行身份验证。) 我对内蒂很陌生,对这一点几乎没有疑问Java Netty中的双向SSL身份验证,java,ssl,netty,Java,Ssl,Netty,我正在开发一个基于服务器和客户端的应用程序,它需要双向SSL身份验证。(客户端使用SSL证书对服务器进行身份验证,服务器对客户端进行身份验证。) 我对内蒂很陌生,对这一点几乎没有疑问 使用Netty是否可以进行双向身份验证 通过向服务器和客户端的管道工厂添加另一个SslHandler可以简单地实现吗 如果上述情况属实,我如何在ChannelConnected()方法中获取所需的SslHandler来执行SslHandshake?是否可以通过再次调用管道来调用channelConconnected
我真的非常感谢您在这方面提供的任何帮助、回答或向正确的方向推进。双向身份验证要求服务器和客户端都具有其他方信任的证书。客户机需要生成一个私钥,将其存储在他的密钥库中,并让服务器的信任库信任的人对其进行签名
这不仅仅是编写什么代码的问题。SSL是一种表示层协议,SSL握手发生在套接字连接建立之后,应用层获得可用的套接字连接之前。无论您使用的是什么应用程序,如果您有SSL协议层,那么您就可以使用SSL
双向身份验证只是上面@EJP提到的配置问题。如果双方都能建立并验证彼此的信任链,那么握手就成功了。有关配置SSL信任库的信息,请参阅netty配置手册。使用netty是否可以进行双向身份验证? 对 可以通过向服务器和客户端的管道工厂添加另一个SslHandler来实现吗? 对 如果上述情况属实,如何在ChannelConnected()方法中获取所需的SslHandler来执行SslHandshake? 创建
SSLContext
时,需要正确设置密钥库和信任库
是否可以通过再次调用管道来调用channelconconnected()方法的第二次握手?
从内存中,客户端和服务器身份验证在第一次握手中完成
在客户机上,将客户机的私钥安装在密钥库中,将服务器的公钥安装在信任库中
在服务器上,在密钥库中安装服务器的私钥,在信任库中安装客户端的公钥
关于这一点,我有什么可以参考的例子吗?
- 这是我为websockets做的一个例子。它只显示如何设置服务器密钥库。您必须添加一个truststore作为
serverContext.init(kmf.getKeyManagers(),null,null)的第二个参数代码>
- 下面是Scala中类似的信任存储设置
- 这里有一个关于如何设置SSLContext的好方法
希望这能有所帮助。SSL握手不一定是在建立连接后立即发生的,它可以在一些纯文本通信之后发生(例如,使用
STARTTLS
-类似协议或HTTP代理CONNECT
)或在重新协商之后发生(通常是在第一次握手中未请求时获取客户端证书)@Bruno但是,纯文本通信不是SSL会话建立过程的一部分吗?不完全是,它通常是握手真正开始之前的正常应用程序协议(通过客户端Hello
)。通常,它发生在最多几个应用程序请求/响应之后,但原则上它可能发生在更长的交换之后。在scala示例中,您没有关闭信任存储的输入流。此外,最好使用Key/TrustManagerFactory.getDefaultAlgorithm()
而不是强制执行SunX509
,这不是TMF的JSSE默认值,也不适用于非基于Sun/Oracle的JRE(例如IBM)。