0

设置:

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

问题:

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

迄今为止的分析表明

  • 信任管理器正确调用客户端和服务器上的 getAcceptedIssuers()
  • 在客户端调用 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

发生。

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

4

1 回答 1

0

基础问题是超时。我通过仔细查看提供“isSuccess()”和“cause()”的 SslHandshakeCompletionEvent 来追踪问题。原因向我指出了 imeout 异常。

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

于 2013-09-20T18:39:41.893 回答