SSLPeerUnverifiedException:对等方未在 Netty 中使用单独计算机上的自签名证书进行身份验证



设置:

  • 我使用 Netty (v4.0.8) 客户端/服务器使用 SSLHandler 来保护连接。
  • 在服务器上,我在码头环境中运行Netty部分,客户端是我从命令行调用的JAR。
  • 我有客户端和服务器的自签名证书。
  • 我在信任存储区中都有 CA 证书,我在两端(服务器和客户端)都使用。我在 JRE 密钥库中也有 CA 证书(以防万一)
  • 有自己的信任存储实现来跟踪我遇到的问题。

问题:

  • 如果客户端和服务器在同一台计算机上运行,则一切都很好。
  • 如果客户端和服务器在不同的机器上运行,我确实首先在服务器上(然后在客户端上)得到SSLPeerUnverifiedException。
  • 我也有客户端的python实现(使用SSL连接)。这自己在相同和单独的机器上工作正常。

到目前为止的分析表明

  • 信任管理器在客户端和服务器上正确调用 getAcceptIssuers()
  • checkServerTrusted() 在客户端上调用
  • checkClientTrusted() 未在服务器上调用

相反,我确实得到了例外:

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated at com.sun.net.ssl.internal.ssl.SSLSessionImpl.getPeerCertificateChain(SSLSessionImpl.java:401)

由于这在服务器上需要一些时间,因此在客户端会发生超时

javax.net.ssl.SSLException: handshake timed out

随后

SSLPeerUnverifiedException:  javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated

发生。

异常发生在 netty 的 userEventTriggered() 方法的 Handler-Class 中。我确实检查了传入事件是否是 SslHandshakeCompletionEvent 以及何时尝试从 SSLSession 获取证书。

基础问题是超时。我通过仔细查看 SslHandshakeCompletionEvent 来追踪这个问题,它提供了"isSuccess()"和"cause()"。原因指出了我的异常。

我通过在netty Initialiser-Classes中增加SSLHandler的超时来解决这个问题。

最新更新