我们有一个 SSL 问题,我 99% 认为这不是您通常使用的证书信任存储旋转木马。
我们有一个 Weblogic 服务器试图通过 LDAPS 与 Active Directory 建立 SSL 连接,底层 SSL 实现是 JSSE。
有时,它会起作用。通常在重新启动 Weblogic 后几个小时。
之后我们开始收到 SSL 握手错误,打开 SSL 调试后我们看到:
[ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)', handling exception: java.net.SocketException: Connection reset [ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)', SEND TLSv1 ALERT: fatal, description = unexpected_message [ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)', WRITE: TLSv1 Alert, length = 32 [ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)', Exception sending alert: java.net.SocketException: Broken pipe
到目前为止,我已经尝试了以下方法来理解/复制它:
- 通过 OpenSSL 连接并加载证书 - 每次都正常
- 通过安全的 ldapsearch 连接并加载证书 - 每次都正常
- 通过自定义测试 Java 客户端连接 - 每次都正常
- 使用 Wireshark 和私钥解密 SSL 握手。
我注意到 Wireshark 的“不良”握手是在客户端发送 Change Cipher Spec 后,Finished 消息 AD 没有以实物形式回复。更重要的是,Wireshark 无法解密 SSL 握手,失败:
ssl_decrypt_pre_master_secret wrong pre_master_secret length (109, expected 48) dissect_ssl3_handshake can't decrypt pre master secret
注意 Wireshark SSL 解密在 SSL 握手完美运行时完美运行。
在 AD 服务器没有响应之前,我看不出 SSL 握手的好坏有任何显着差异。
在这一点上我被难住了......我真的很难理解为什么这会在某些时候失败并在剩下的时间里工作,在这一点上我真的只是希望得到一些关于可能是什么的建议继续。
哦对了,差点忘了。 Active Directory 事件日志中存在错误:
Event ID: 36888 The following fatal alert was raised: 20. The state of the internal error is 960.
经过一些研究,我设法发现对应于 SSL“BAD_RECORD_MAC”错误。
此时我唯一的理论是,由于某种原因,错误的公钥被用于加密握手......我看不出为什么服务器(和 Wireshark)无法解密完成的消息。
谢谢!
更新:
我比较了好的和坏的情况,两种情况下的密码规范是相同的:TLS_RSA_WITH_AES_128_CBC_SHA。我还比较了来自客户端和服务器端的数据包,除了正常的以太网和 IP 协议(protocol)差异外,它们看起来完全相同。
最佳答案
经过大量的研究、实验和反省。我们最终将这个问题追溯到我们用来连接外部系统的第三方库。在初始化时,它会将自己添加为 JSSE 默认提供程序之前的安全提供程序。我不知道为什么这会继续中断所有后续的 SSL 连接……但确实如此。
感谢您的帮助。
关于java - 间歇性 SSL 握手错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11960021/