设置:
- 我使用 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 获取证书时。