我们的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注意到“糟糕的”握手,是在客户端发送更改密码规范后,“完成”消息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
注意:当SSL握手正常运行时,Wireshark SSL解密可以正常运行.
我看不到SSL握手的好坏,直到AD服务器无响应为止.
在这一点上,我感到很困惑……我真的很难理解为什么在某些时候会失败,而其余的工作都会继续,在这一点上,我真的只是希望就可能发生的事情提出一些建议.
哦,是的,差点忘了. 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协议差异,否则它们似乎都是相同的.
解决方法:
因此,经过大量的研究,实验和灵魂探索.最终,我们将此问题归结为用于连接外部系统的第三方库.在初始化时,它将在JSSE默认提供程序之前将其自身添加为安全提供程序.我不知道为什么这会继续中断所有后续的SSL连接…但是确实如此.
谢谢你的帮助.