簡體   English   中英

驅動程序無法使用安全套接字層 (SSL) 加密與 SQL Server 建立安全連接。 錯誤:“PKIX 路徑構建失敗:

[英]The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "PKIX path building failed:

我是 SQL(Microsoft SQL Server Management)的新手,我正在嘗試將它與 IntelliJ 連接起來

我收到以下錯誤:com.microsoft.sqlserver.jdbc.SQLServerException:驅動程序無法使用安全套接字層 (SSL) 加密與 SQL Server 建立安全連接。 錯誤:“PKIX 路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到請求目標的有效證書路徑”。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class MyJDBC {

public static void main(String[] args) {


    String  connectionURL = "jdbc:sqlserver://localhost:10020;databaseName=mydatabase;user=me;password=random_password";
    try {
        System.out.print("Connecting to the server......");
        try (Connection connection = DriverManager.getConnection(connectionURL))   {
            System.out.println("Connected to the Server.");
        }
    }catch (Exception e){
        System.out.println("I am not connected to the Server");
        e.printStackTrace();
    }
}
}

我的庫LIB上有這個

任何幫助表示贊賞!

encrypt=truetrustServerCertificate=true添加到連接 url。

String  connectionURL = "jdbc:sqlserver://localhost:10020;databaseName=mydatabase;user=me;password=random_password;encrypt=true;trustServerCertificate=true";

Microsoft 博客參考 - 鏈接
在下面找到它的摘錄 -

這是 Java 證書存儲中的一個問題。 作為一種快速解決方法,如果您在連接字符串中啟用 TrustServerCertificate=True,則來自 JDBC 的連接會成功。 當 TrustServerCertificate 設置為 true 時,傳輸層將使用 SSL 加密通道並繞過證書鏈來驗證信任。 如果 TrustServerCertificate 設置為 true 並打開了加密,則即使 Encrypt 設置為 false,也將使用服務器上指定的加密級別。 否則連接將失敗。 但是,出於安全考慮,不建議繞過證書驗證。 因此,要解決此問題,請按照以下步驟更改連接字符串並導入所需的證書。

更改連接字符串以指向 Java 證書路徑

String connectionUrl = "jdbc:sqlserver://localhost:1433;" + String connectionUrl = "jdbc:sqlserver://localhost:1433;" + "databaseName=AdventureWorks;integratedSecurity=true;" + "databaseName=AdventureWorks;integratedSecurity=true;" + "encrypt=true; trustServerCertificate=false;" + "encrypt=true; trustServerCertificate=false;" + "trustStore= C:\Program Files\Java\jdk-14.0.2\lib\cacert;trustStorePassword=changeit";

導入本文檔中提到的所有證書。

注意:要將上述證書導入密鑰庫 cacerts,請使用以下命令,請注意您必須在連接字符串中提及信任庫和信任庫密碼才能成功連接。 在 Java 證書存儲中導入缺失證書的步驟

從這里下載所有證書,將它們存儲在客戶端主機上的某個位置,然后使用 keytool 實用程序將這些證書導入信任庫。 請按照以下步驟操作:

保存上述 MS doc 中的所有證書。 Keytool 實用程序位於默認 Java 位置 (C:\Program Files\Java\jdk-14.0.2\bin) 的 bin 文件夾中。 您需要使用命令提示符導航到該位置。 然后可以使用 keytool 命令導入之前保存的證書。 當提示輸入密碼時,將密碼中的密鑰作為“changeit”插入

命令示例:

keytool -importcert -trustcacerts -alias TLS1 -file "C:\Users\Documents\Microsoft RSA TLS CA 01.crt" -keystore "C:\Program Files\Java\jdk-14.0.2\lib\security\cacerts"

keytool -importcert -trustcacerts -alias TLS2 -file "C:\Users\Documents\Microsoft RSA TLS CA 02.crt" -keystore "C:\Program Files\Java\jdk-14.0.2\lib\security\cacerts"

以下為我工作:

jdbc:sqlserver://Host;trustServerCertificate=true;integratedSecurity=true;authenticationScheme=NTLM

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM