我正在开发一个基于服务器和客户端的应用程序,它需要双向SSL身份验证。 (客户端使用SSL证书验证服务器和服务器对客户端进行身份验证。)
我对Netty很陌生,对此毫无疑问。
我真的很感激有关这方面的帮助,答案或推动正确的方向。
先谢谢。
答案 0 :(得分:11)
使用Netty进行双向身份验证吗?
是
通过向服务器和客户端的管道事件添加另一个SslHandler,可以简单地实现吗?
是
如果以上情况属实,我如何在ChannelConnected()方法中获取所需的SslHandler来执行SslHandshake?
创建SSLContext
时,您需要正确设置密钥库和信任库。
是否可以通过再次调用管道来调用ChannelConected()方法的第二次握手?
从内存中,客户端和服务器身份验证在第一次握手中完成。
在客户端上,将客户端的私钥安装在密钥库中,将服务器的公钥安装在信任库中。
在服务器上,将服务器的私钥安装在密钥库中,将客户端的公钥安装在信任库中。
我可以参考哪些例子吗?
这是我为websockets所做的example。它只显示如何设置服务器密钥库。您必须添加信任库作为serverContext.init(kmf.getKeyManagers(), null, null);
以下是Scala中使用信任存储设置的类似example。
关于如何设置SSLContext,这是一个很好的java guide。
希望这有帮助。
答案 1 :(得分:3)
双向身份验证要求服务器和客户端都拥有其他信任的证书。客户端需要生成私钥,将其存储在密钥库中,并由服务器信任库信任的某个人签名。
这不仅仅是你写的代码的问题。
答案 2 :(得分:1)
SSL是一种表示层协议,并且在建立套接字连接之后以及应用程序层获得可用套接字连接之前就会发生SSL握手。无论您使用何种应用程序,如果您拥有SSL协议层,那么您可以使用SSL。
双向身份验证只是上面@EJP提到的配置问题。如果双方都可以建立并验证彼此的信任链,则握手成功。请参阅netty配置手册以配置SSL信任库。