Java无法连接Windows Docker部署的SQL Server:SSL认证路径错误
解决Docker部署的SQL Server与Java JDBC连接SSL证书验证失败问题
问题原因
Docker中运行的Microsoft SQL Server默认使用自签名SSL证书,而Java的默认信任库(cacerts)未包含该证书,导致JDBC驱动在建立SSL连接时无法完成证书链验证,抛出PKIX path building failed错误。VS Code的SQL Server扩展默认跳过了严格的SSL验证,因此可以正常连接。
解决方案
方案1:临时跳过SSL证书验证(仅适用于测试环境)
在JDBC连接URL中添加trustServerCertificate=true参数,让驱动直接信任服务器证书,无需验证证书链:
修改连接URL代码:
String url = String.format("jdbc:sqlserver://%s;databaseName=%s;user=%s;password=%s;trustServerCertificate=true", hostName, dbName, user, password);
也可以添加encrypt=false完全禁用SSL加密,但不推荐(会降低连接安全性):
String url = String.format("jdbc:sqlserver://%s;databaseName=%s;user=%s;password=%s;encrypt=false", hostName, dbName, user, password);
方案2:导入自签名证书到Java信任库(生产环境推荐)
将SQL Server的自签名证书导入Java的系统信任库,让Java信任该证书:
从Docker容器中导出证书
- 先查看SQL Server容器ID:
docker ps - 将容器内的证书文件复制到本地Windows目录(比如
C:\temp):docker cp <容器ID>:/var/opt/mssql/data/mssql.pem C:\temp\mssql.pem
- 先查看SQL Server容器ID:
导入证书到Java信任库
- 找到你的JDK/JRE安装目录下的
cacerts文件,路径通常为:C:\Program Files\Java\jdk-17.x.x\lib\security\cacerts - 打开命令提示符(以管理员身份运行),执行
keytool命令导入证书:keytool -importcert -file C:\temp\mssql.pem -alias mssql-docker -keystore "C:\Program Files\Java\jdk-17.x.x\lib\security\cacerts" - 输入信任库默认密码:
changeit,然后输入yes确认导入证书。
- 找到你的JDK/JRE安装目录下的
重启Java应用,重新执行连接代码即可建立安全的SSL连接。
内容的提问来源于stack exchange,提问作者Mohsen
相关产品推荐
相关产品推荐

