3

我正在开发一个基于服务器和客户端的应用程序,它需要两种方式的 SSL 身份验证。(客户端验证服务器和服务器验证客户端都使用 SSL 证书。)

我对 Netty 很陌生,对此几乎没有疑问。

  1. 使用 Netty 可以进行两种身份验证吗?
  2. 通过向服务器和客户端的 pipelinefactories 添加另一个 SslHandler 可以简单地实现吗?
  3. 如果上述情况属实,如何在 ChannelConnected() 方法中获取所需的 SslHandler 来执行 SslHandshake?是否可以通过再次调用管道来调用 ChannelConected() 方法的第二次握手?
  4. 有什么我可以参考的例子吗?

我非常感谢有关此问题的任何帮助,答案或朝着正确方向的推动。

4

3 回答 3

11

使用 Netty 可以进行两种身份验证吗?

是的

通过向服务器和客户端的 pipelinefactories 添加另一个 SslHandler 可以简单地实现吗?

是的

如果上述情况属实,如何在 ChannelConnected() 方法中获取所需的 SslHandler 来执行 SslHandshake?

创建SSLContext.

是否可以通过再次调用管道来调用 ChannelConected() 方法的第二次握手?

从内存中,客户端和服务器身份验证在第一次握手中完成。

在客户端上,将客户端的私钥安装在密钥库中,将服务器的公钥安装在信任库中。

在服务器上,将服务器的私钥安装在密钥库中,将客户端的公钥安装在信任库中。

有什么我可以参考的例子吗?

  • 这是我为 websockets 做的一个例子。它仅向您展示如何设置服务器密钥库。您必须添加一个信任库作为第二个参数serverContext.init(kmf.getKeyManagers(), null, null);

  • 这是 Scala 中使用信任存储设置的类似示例

  • 这是关于如何设置 SSLContext的一个很好的java 指南。

希望这可以帮助。

于 2012-05-16T00:46:42.833 回答
3

双向身份验证要求服务器和客户端都具有对方信任的证书。客户端需要生成一个私钥,将其存储在他的密钥库中,并由服务器信任库信任的人对其进行签名。

这不仅仅是你编写什么代码的问题。

于 2012-05-15T10:17:19.467 回答
1

SSL 是一种表示层协议,SSL 握手发生在套接字连接建立之后和应用层获得可用套接字连接之前。无论您使用什么应用程序,如果您有 SSL 协议层,那么您就可以在 SSL 上工作。

双向身份验证只是上面@EJP 提到的配置问题。如果双方可以建立并验证彼此的信任链,则握手成功。有关配置 SSL 信任库的信息,请参阅 netty 配置手册。

于 2012-05-15T10:27:12.987 回答