我相信我找到了失败的原因。该错误报告似乎正确地描述了我遇到的问题:使用来自SunJCE和PKCS11的DH密钥协议隐含的生成秘密的长度不一致。我检查的每一次失败都有一个PreMaster Secret密钥,第一个字节带有00,而每次成功都在第一个字节(通常为01)中带有其他内容。错误报告指出固定版本为Java 8,因此我假设它从未在所使用的Java 7中固定。
在能够升级到Java 8之前,我能够通过更改java.security文件来迫使JVM不使用任何Diffie-Hellman密码套件:
jdk.tls.disabledAlgorithms=SSLv3, DH, DHE, ECDH, ECDHE
该文件位于服务器上Java JDK目录的jre / lib / security子目录中。检查日志表明现在正在使用一个RSA密码套件,并且不再发生故障。
我唯一不愿意宣布这一绝对原因的是,对此错误的分析表明,它应该只发生256次握手中的1次,但是我发现它几乎有40-50%的时间发生。无论如何,绕过DH密码套件后,该异常不再发生。