我们在将服务从OpenSSL 1.1.1迁移到3.0.8版本后,遇到了一个棘手的TLS握手问题。客户端(基于Java 11的HTTP客户端)在约30%的连接尝试中,会触发"SSL handshake failure: decryption failed"错误。服务端日志显示,SSL_accept()在TLS 1.2握手过程中,于RSA Encrypted Premaster Secret解密步骤突然返回-1,错误队列提示SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC。
我们已经排除了常见的网络丢包、证书链配置错误、协议/算法不匹配等因素。核心疑点集中在RSA密钥交换过程:通过调试发现,失败时客户端发送的RSA加密预主密钥长度正确(256字节),但服务端解密后得到的明文预主密钥,其前两字节(TLS版本号)有时并非客户端Random中记录的版本(0x0303),而是类似0x0302或其他值,这直接导致后续主密钥计算失配。
我们已检查了服务端的RSA私钥(2048位)与证书匹配,且密钥文件权限正常。OpenSSL 3.0的默认提供者、密钥加载方式是否引入了某些边界条件?或是与Java客户端在PKCS#1填充处理上存在微妙的兼容性问题?希望有熟悉TLS协议栈底层和OpenSSL 3.0密码学提供者机制的朋友,能提供深入的排查方向或类似案例的解决方案。
邀请回答
换一换
暂无数据