【问题标题】:The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption. Error: "PKIX path building failed:驱动程序无法使用安全套接字层 (SSL) 加密建立与 SQL Server 的安全连接。错误:“PKIX 路径构建失败:
【发布时间】:2022-06-17 23:21:25
【问题描述】:

我是 SQL(Microsoft SQL Server 管理)的新手,我正在尝试将它与 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

感谢任何帮助!

【问题讨论】:

标签: java sql intellij-idea


【解决方案1】:

encrypt=truetrustServerCertificate=true 添加到连接网址。

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

微软博客参考 - link
在下面找到它的摘录 -

这是 Java 证书存储中的一个问题。作为一种快速的解决方法,如果 您在连接字符串中启用 TrustServerCertificate=True, 来自 JDBC 的连接成功。当 TrustServerCertificate 设置为 是的,传输层将使用 SSL 加密通道和 绕过证书链来验证信任。如果 TrustServerCertificate 设置为 true 并打开加密,则 即使加密也将使用服务器上指定的加密级别 设置为假。否则连接将失败。然而,对于 安全考虑,不建议绕过 证书验证。因此,要解决此问题,请按照以下步骤操作 下面更改连接字符串并导入所需的 证书。

更改连接字符串以指向 Java 证书路径

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

导入此document 中提到的所有证书。

注意:要将上述证书导入密钥库 cacerts,请 使用以下命令,请注意您必须提及信任库和 连接字符串中的信任库密码以成功连接。 在 Java 证书存储中导入缺失证书的步骤

从这里下载所有证书,将它们存储在客户端的某个位置 主机,然后使用 keytool 实用程序将这些证书导入到 信任库。请按照以下步骤操作:

保存上述 MS doc 中的所有证书。 Keytool 实用程序位于 默认 Java 位置的 bin 文件夹(C:\Program 文件\Java\jdk-14.0.2\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"

【讨论】:

    【解决方案2】:

    谢谢你,我成功修复了错误

    【讨论】:

    • Trung Cù,请不要添加 thanks 作为答案。它们实际上并没有提供问题的答案,并且可能被未来的访问者视为噪音。一旦你earn足够reputation,你将获得upvote answers你喜欢的特权。这样,问题的未来访问者将看到对该答案的更高投票数,并且回答者也将获得声誉积分奖励。见Why is voting important
    猜你喜欢
    • 2019-12-26
    • 1970-01-01
    • 2019-09-25
    • 2015-11-03
    • 1970-01-01
    • 2015-12-22
    • 2021-07-08
    • 2022-01-19
    • 2021-10-11
    相关资源
    最近更新 更多