java - 间歇性 SSL 握手错误

标签 java security ssl active-directory weblogic

我们有一个 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/

相关文章:

php - 在数据到达服务器之前加密数据

java - 用于部署 Web 应用程序的 Infinispan 独特缓存管理器

java - 如何使用 Curator 检查 Zookeeper 服务器是否已启动?

python - 用于安全的目的是什么?

Ruby Datamapper 通过 SSL 连接到 Amazon RDS 上的 MariaDB

python - 如何使用 geopy 在 Anaconda 虚拟环境中禁用证书检查

Python Twisted 如何使用新的 IPolicyForHTTPS 为 twisted.web.client.Agent 设置 SSL 方法?

java - Stratio cassandra-lucene-index 插件 + BoundStatements

java - 为什么 BigDecimal.ZERO 是未缩放的?

c - 为什么我的缓冲区溢出尝试会出现段错误?