本地Spring Boot连接SQL Server遇PKIX证书路径错误求助
问题背景
本地安装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
已查阅大量相关文档并尝试多种方案,但均未解决。仅当将application.properties中的spring.jpa.hibernate.ddl-auto设为none时,程序虽报错但不会终止运行。SQL Server中已创建含表和数据的目标数据库。
已执行操作
- 从网站下载随机SSL证书并添加到Java目录的cacert文件中
- 配置Spring Boot适配SQL Server
- 为SQL Server配置SSL加密
当前配置
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
Maven依赖
<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>
解决建议
修正JDBC URL的SSL参数
当前JDBC URL未配置SSL相关参数,SQL Server启用SSL后,JDBC连接需明确证书验证规则。先添加参数测试连接:spring.datasource.url=jdbc:sqlserver://localhost;databaseName=Car;encrypt=true;trustServerCertificate=true注:
trustServerCertificate=true仅用于临时测试,生产环境必须使用合法可信的证书。导入SQL Server的正确证书
之前添加的随机网站证书完全无效,必须使用SQL Server自身的SSL证书:- 打开SQL Server配置管理器,依次进入「SQL Server网络配置」→「实例协议」→ 右键点击「属性」→「证书」选项卡,选中已配置的证书,点击「查看」后导出为Base64编码的CER格式文件。
- 使用
keytool命令将证书导入Spring Boot运行所用JDK的cacerts库:keytool -importcert -file sqlserver-cert.cer -alias sqlserver-local -keystore $JAVA_HOME/jre/lib/security/cacerts -storepass changeit
注意:务必确认
$JAVA_HOME指向的是Spring Boot实际运行的JDK,避免导入到错误的信任库。使用应用专属信任库(可选)
若不想修改系统级cacerts,可配置Spring Boot使用自定义信任库:spring.datasource.hikari.data-source-properties.trustStore=classpath:sqlserver-truststore.jks spring.datasource.hikari.data-source-properties.trustStorePassword=changeit先将SQL Server证书导入到这个自定义的JKS文件中,命令示例:
keytool -importcert -file sqlserver-cert.cer -alias sqlserver-local -keystore sqlserver-truststore.jks -storepass changeit验证SQL Server SSL配置有效性
使用SQL Server Management Studio连接时,勾选「连接属性」中的「加密连接」,确认能正常连接,排除SQL Server端SSL配置错误。检查JVM启动参数
确认Spring Boot启动时未被指定错误的信任库参数,比如-Djavax.net.ssl.trustStore若被错误设置,会覆盖默认的cacerts路径。
内容的提问来源于stack exchange,提问作者taathy

