SQL Server/Spring Boot: PKIX路径构建失败: 无法找到有效的证书路径以请求目标

16
我在本地计算机上安装了SQL Server,并将其嵌入到我的Spring Boot应用程序中。启动Tomcat后,我收到以下错误消息:'PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target'. ClientConnectionId:85411829-6853-4fdb-9373-b4c93e1d5e8f
我知道这个错误已经有很好的文档记录了。我按照许多指南进行操作并阅读了很多相关的内容,但我找到的所有建议都没有解决我的问题。
我所做的事情包括:
- 从网站下载一个随机的SSL证书并将其添加到Java目录下的cacert文件中(描述在此处)。 - 为SQL Server配置Spring Boot (描述在此处) - 为SQL Server配置SSL加密 (描述在此处)
这些方法都未能解决错误。唯一发现的是,如果我在application.properties中将spring.jpa.hibernate.ddl-auto设置为none,程序会显示错误消息,但并不会中止运行。
我的application.properties如下所示:
spring.datasource.url=jdbc:sqlserver://localhost;databaseName=Car
spring.datasource.username=admin
spring.datasource.password=password123
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2012Dialect
server.port=8443
server.ssl.key-alias=selfsigned_localhost_sslserver
server.ssl.key-password=changeit
server.ssl.key-store=classpath:ssl-server.jks
server.ssl.key-store-provider=SUN
server.ssl.key-store-type=JKS

我的依赖关系:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

在SQL Server中,我创建了一个包含表和其中的数据的数据库。
你们中有人对如何解决这个错误有进一步的建议吗?

1
为什么要从随意的网站下载证书并添加到密钥库中? - AlwaysLearning
你是否正在使用SQL Server的JDBC驱动程序10.2(或更高版本)?10.2引入了一个重大变化,即默认应用Encrypt=true,参考:发布了SQL Server的JDBC驱动程序10.2 - AlwaysLearning
2
SQL Server已安装了自签名证书,这就是您需要公钥添加到密钥存储区的证书。您可以通过SQL Server(版本)配置管理器> SQL Server网络配置>右键单击(实例名称)的协议>属性>证书选项卡找到此证书。单击“查看”按钮,在打开的证书对话框中单击“详细信息”选项卡和“复制到文件...”按钮以导出其公钥。然后,您可以将该公钥添加到您的密钥存储区。 - AlwaysLearning
@AlwaysLearning,证书中的查看按钮被禁用了,能帮忙一下吗? - Ahmed Hosny
@AlwaysLearning的答案是正确的。我也遇到了同样的问题,而且AlwaysLearning的建议解决了这个问题。谢谢。 - mjk6035
显示剩余3条评论
2个回答

43

我在使用Spring Boot 2.7.4时遇到了同样的问题

从评论中可以看出你正在使用10.2.X版本的驱动程序

事实证明,自从2.7.0开始,SQL Server的JDBC驱动程序10.2被用于替代2.6.x中的9.4.1.jre8

因此,以下是我找到的两种解决方法之一:

1. 使用旧版的mssql-jdbc驱动程序

    <properties>    
        <mssql-jdbc.version>9.4.1.jre8</mssql-jdbc.version>
    </properties>

2. 或者让驱动程序相信SQL服务器证书
您可以通过将以下内容添加到连接字符串中来实现:

jdbc:sqlserver://hOSt:pORt;databaseName=dbName;encrypt=true;trustServerCertificate=true

5
我之前遇到了与现有服务器相同的问题,以下是帮助解决问题的通知:
有用的通知:encrypt=true;trustServerCertificate=true
此外,在创建Java实体时,请确保数据库中也有相同的实体。
# Microsoft SQL Server config

spring.datasource.url=jdbc:sqlserver://serverNameOrAdress:1443;databaseName=****;encrypt=true;trustServerCertificate=true
spring.jpa.database-platform=org.hibernate.dialect.SQLServerDialect
spring.datasource.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.datasource.username=***
spring.datasource.password=***

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接