錯誤環境:使用 OpenJDK 11 連線 SQL Server 2008 時,發生了找不到 openjdk 驅動程式無法使用安全通訊端層 (SSL) 加密建立與 SQL Server 的安全連接。錯誤: “The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”。 ClientConnectionId:e98d4e86-b063-47d6-8bc7-7e0c482b146d 的結果。
發生原因:眾說紛云。
一、升級至 JAVA11 後、TLSv1 & TLSv1.1 被預設 Disabled。
二、SQL Server 2008 要求加密連線、需更新。
解決方法:
在不動到 Server 的情況下,嘗試改寫連線方式及各種無腦測試後、以最簡單的方式解決了。
在 java.security 這個設定檔中,找到 jdk.tls.disabledAlgorithms ,刪掉其中的 TLSv1 、即可連線成功。
- 在 Google 時發現,很多文章都會寫此檔案放在 %JAVAHOME%\JAVA\jreXXX\lib\security 中、一開始時一直沒找到;後來我反而是在 %JAVAHOME%\jdk-11.0.13.8-hotspot\Conf\Security 中找到的。有可能是因為版本的不同所以導致資料夾不同,有時候多注意一下,以免浪費了不必要的時間。
20230822 Tips:
在 Mac OS 中尋找 Java 安裝位置
/usr/libexec/java_home -v
20240124 Tips:
最近試著升級成 jdk 17 & SpringBoot 3.2.1 時、遇到了以下問題:
“encrypt” 屬性設定為 “true” 且 “trustServerCertificate” 屬性設為 “false”,但驅動程式無法使用安全通訊端層 (SSL) 加密建立 SQL Server 的安全連線: 錯誤: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target。 ClientConnectionId:77468a01-4798-4f83-a45c-b1b4e5833e6b
除了之前把 TLSv1 去除掉之外、需要在 application.properties 中再增加設定:
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.url=jdbc:sqlserver://127.0.0.1:1433;databaseName=LYS_ERP;encrypt=false
雖然是可以連絡了、但還是會出現以下警告訊息:
TLSv1 was negotiated. Please update server and client to use TLSv1.2 at minimum.
主要問題還是在於 SQL 2008 、就先撐著吧、看何時解決不了不得不升級囉!