Java Netty中的双向SSL身份验证

Java Netty中的双向SSL身份验证,java,ssl,netty,Java,Ssl,Netty,我正在开发一个基于服务器和客户端的应用程序,它需要双向SSL身份验证。(客户端使用SSL证书对服务器进行身份验证,服务器对客户端进行身份验证。) 我对内蒂很陌生,对这一点几乎没有疑问 使用Netty是否可以进行双向身份验证 通过向服务器和客户端的管道工厂添加另一个SslHandler可以简单地实现吗 如果上述情况属实,我如何在ChannelConnected()方法中获取所需的SslHandler来执行SslHandshake?是否可以通过再次调用管道来调用channelConconnected

我正在开发一个基于服务器和客户端的应用程序,它需要双向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)。