最近一個項目因為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,最后問題才得以解決