SVN SSL证书验证失败求助:Sonar构建报错重启后问题复现
你遇到的这个问题很典型——SonarQube执行代码分析时调用SVN blame命令,因为SSL证书信任问题失败,而且之前临时接受证书的操作在系统重启后就失效了。核心原因是临时接受的证书没有被永久存储,或者存储的位置和Maven执行时的用户环境不匹配。下面给你几个靠谱的解决步骤:
1. 永久信任SVN服务器证书(最直接方案)
首先,务必用和运行Maven命令完全相同的用户,手动执行一次SVN仓库访问命令,选择永久接受证书:
svn info https://xxxxxxd01.xx.com/svn/project/trunk
执行后会弹出证书验证提示,输入p(代表永久信任)并回车。这样证书会被保存到该用户的SVN配置目录下,重启后也不会丢失。
如果是Windows系统,打开对应用户的命令提示符,执行上述命令,按提示选择永久信任即可。
2. 确认证书已被正确持久化存储
证书会被保存在用户专属的SVN认证目录:
- Linux/macOS:
~/.subversion/auth/svn.ssl.server/ - Windows:
C:\Users\<你的用户名>\AppData\Roaming\Subversion\auth\svn.ssl.server\
进入这个目录,你应该能看到一个以服务器哈希命名的文件,这就是你永久信任的证书文件。如果没有,说明刚才的永久接受操作没执行成功,或者你用错了用户。
3. 确保Maven与SVN的用户一致性
如果你的Maven命令是通过自动化工具(比如Jenkins、GitLab CI)运行的,一定要确认工具使用的用户和你手动接受证书的用户是同一个。比如Jenkins默认用jenkins用户,你需要切换到该用户下执行SVN命令:
sudo su - jenkins svn info https://xxxxxxd01.xx.com/svn/project/trunk
4. 导入企业CA证书到系统/Java信任库(针对内部CA场景)
如果SVN服务器的证书是企业内部CA颁发的,你可以把CA根证书导入到系统信任存储,或者Java的信任库(因为Maven是Java应用):
导入到Java cacerts
keytool -import -trustcacerts -alias svn-internal-ca -file /path/to/your-ca.crt -keystore $JAVA_HOME/jre/lib/security/cacerts
默认密码是changeit,执行后重启Maven即可生效。
导入到系统信任库(Linux)
sudo cp /path/to/your-ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates
为什么重启后临时接受会失效?
临时接受证书(一般选t)只会把证书存在当前会话的临时缓存里,系统重启或者会话结束后就会被清除。只有选p永久接受,才会把证书写到用户的SVN配置目录,实现持久化保存。
内容的提问来源于stack exchange,提问作者Manasa Ramya

