设置:
- 我使用 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的超时来解决这个问题。