我们有 SSL 问题,我 99% 这不是您通常的证书信任存储旋转木马。
我们有一个 Weblogic 服务器试图通过 LDAPS 与 Active Directory 建立 SSL 连接,底层 SSL 实现是 JSSE。
有时,它有效。通常在重新启动 Weblogic 后几个小时。
之后我们开始收到 SSL 握手错误,打开 SSL 调试,我们看到:
[ACTIVE] ExecuteThread: '10' for queue: 'weblogic.kernel.Default (self-tuning)', 处理异常: 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)', 异常发送警报: java.net.SocketException: Broken pipe
到目前为止,我已经尝试了以下方法来理解/复制它:
- 通过 OpenSSL 连接并加载证书 - 每次都可以正常工作
- 通过加载证书的安全 ldapsearch 连接 - 每次都可以正常工作
- 通过自定义测试 Java 客户端连接 - 每次都可以正常工作
- 使用 Wireshark 和私钥解密 SSL 握手。
我注意到 Wireshark 的“糟糕”握手是在客户端发送 Change Cipher Spec 后,完成的消息 AD 不会以实物形式回复。更重要的是,Wireshark 无法解密 SSL 握手,失败:
ssl_decrypt_pre_master_secret 错误 pre_master_secret 长度(109,预期 48) dissect_ssl3_handshake 无法解密 pre master secret
注意 当 SSL 握手完美运行时,Wireshark SSL 解密也能完美运行。
我看不到 SSL 握手的好坏有任何显着差异,直到 AD 服务器没有响应。
在这一点上,我被难住了......我真的很难理解为什么这会在某些时候失败并在剩下的时间里工作,在这一点上,我真的只是希望对可能发生的事情提出一些建议。
哦,是的,差点忘了。Active Directory 事件日志中有错误:
事件 ID:36888 引发了以下致命警报:20。内部错误的状态为 960。
经过一番研究,我设法发现对应于 SSL“BAD_RECORD_MAC”错误。
在这一点上我唯一的理论是,由于某种原因,错误的公钥被用于加密握手......我看不出为什么服务器(和 Wireshark)无法解密完成的消息。
谢谢!
更新:
我比较了坏情况和好情况,两种情况下的密码规范是相同的:TLS_RSA_WITH_AES_128_CBC_SHA。我还比较了来自客户端和服务器端的数据包,除了正常的以太网和 IP 协议差异外,它们看起来都是相同的。