最近一个项目因为SQLServer从2008升级到了2016导致出现“驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“java.lang.RuntimeException: Could not generate DH keypair””的错误;
项目环境:jdk1.6 + tomcat7
看了很多篇关于这类问题的文章还有官方的文档(https://docs.microsoft.com/zh-cn/sql/connect/jdbc/connecting-with-ssl-encryption?view=sql-server-2016 ),但都解决不了;
首先,我是怀疑是因为升级了SQLServer,所以可能是驱动包版本的问题,但后来我用同样的驱动包和环境在其他机器缺并没有发生同样的错误,所以排除了驱动包的问题;
然后,根据错误提示“java.lang.RuntimeException: Could not generate DH keypair”的问题找到了文章 https://blog.csdn.net/cw_hello1/article/details/51740893
按照该文所说在jre的ext路径中添加了 bcprov-ext-jdk15on-1.54.jar和bcprov-jdk15on-1.54.jar 两个依赖 并修改了java.security中的策略,随后重启tomcat发现虽然“Could not generate DH keypair”错误解决了,但却出现了新的错误“Unsupported curveId: 29”,大致上可以得知添加两个依赖这个操作确实是解决了生成“DH keypair”的问题,但是生成的“DH keypair”并不能得到支持;
到这里基本上可以确认是jdk的问题,然后我又到Q群里资讯了一些熟悉SQLServer的大神们,得知JDK1.6确实是存在这个问题,而这个问题在JDK1.7得到了修复;但这时我很疑惑,因为我用同样的驱动包和1.6环境在其他机器却并没有发现这个问题;但现在回想可能是虽然同样是1.6但小版本号不同,我用的那个1.6可能刚好解决了这个问题,而生产坏境中那个1.6版本并没有解决;
因此我跟项目总监说明了情况,并准许我将生产环境中1.6JDK升级到了1.8,最后问题才得以解决