Artifactory7.38.10配置MSSQL元数据库启动报TLS握手失败故障
在Windows服务器上安装Artifactory 7.38.10,在system.yml中配置Microsoft SQL Server作为元数据存储数据库,参考的JDBC连接串格式如下:
String connectionUrl = "jdbc:sqlserver://localhost:1433;" + "databaseName=AdventureWorks;integratedSecurity=true;" + "encrypt=true;trustServerCertificate=true";
执行artifactory.bat启动服务时抛出如下错误:
Could not initialize database (db config: {mssql jdbc:sqlserver://dev.tfs2017sql.xyz.com:55300;databaseName=JFROGPOC;encrypt=false;sendStringParametersAsUnicode=false;applicationName=Artifactory Binary Repository;integratedSecurity=true;}): TLS Handshake failed: x509: certificate signed by unknown authority
error connecting to database. giving up
报错栈:jfrog.com/metadata/v7/services/common/db.(*databaseBearer).init jfrog.com/metadata/v7@v7.37.0/services/common/db/database_bearer.go:152
当前运行环境Java版本为11,JDBC驱动采用适配Windows集成认证的mssql-jdbc_auth-10.2.1.x64.dll。
核心根因:10.x版本的MSSQL JDBC驱动默认强制对所有连接启用登录阶段TLS握手,即便连接串设置encrypt=false,仍会校验SQL Server服务端返回的TLS证书,当前JDK信任库中不存在该证书的签发根CA,因此抛出信任校验失败错误,该问题与Windows集成认证的dll文件无直接关联。
可按以下优先级选择方案修复:
- 非生产/测试环境快速修复
直接在现有JDBC连接串末尾追加;trustServerCertificate=true参数,跳过证书校验,修改后的完整连接串示例:
保存jdbc:sqlserver://dev.tfs2017sql.xyz.com:55300;databaseName=JFROGPOC;encrypt=false;sendStringParametersAsUnicode=false;applicationName=Artifactory Binary Repository;integratedSecurity=true;trustServerCertificate=truesystem.yml后重启Artifactory服务即可验证,该配置存在中间人攻击风险,禁止在生产环境使用。 - 生产环境合规修复(导入证书到JDK信任库)
- 向数据库管理员获取SQL Server实例当前使用的TLS证书的根CA公钥文件(.cer格式)
- 定位Artifactory启动时实际加载的JDK路径,找到信任库文件,默认路径为
$JAVA_HOME/lib/security/cacerts(若使用Artifactory内置JDK,则在Artifactory安装目录下的jdk子目录中查找,cacerts默认密码为changeit) - 打开CMD执行keytool命令导入证书:
执行后输入keytool -importcert -alias mssql_jfrog_poc -file "C:\cert\sqlserver_root.cer" -keystore "C:\Program Files\Java\jdk-11\lib\security\cacerts" -storepass changeity确认信任该证书。
4. 执行以下命令验证证书已成功导入:keytool -list -alias mssql_jfrog_poc -keystore "C:\Program Files\Java\jdk-11\lib\security\cacerts" -storepass changeit- 重启Artifactory服务即可正常连接。
- 额外校验项
- 确认
mssql-jdbc_auth-10.2.1.x64.dll版本与JDBC驱动主版本完全一致,且文件已放入JDK的bin目录或Windows系统System32目录,避免集成认证异常干扰排查 - 检查
system.yml中数据库配置段的JDBC串无多余转义字符、空格,配置格式符合要求 - 若使用自签名证书,也可将根证书导入Windows系统的「受信任的根证书颁发机构」存储,部分JDBC驱动版本可自动读取系统证书,但稳定性弱于直接导入JDK信任库的方案。
- 确认
内容的提问来源于stack exchange,提问作者Srinivas Charan Mamidi

