问题背景
您在使用 SonarQube 与 GitHub Enterprise 进行拉取请求装饰时,遇到了间歇性的 javax.net.ssl.SSLPeerUnverifiedException
异常。具体错误信息如下:
txt
javax.net.ssl.SSLPeerUnverifiedException: Hostname XXXXXXX not verified (no certificates)
at okhttp3.internal.connection.RealConnection.connectTls(RealConnection.java:353)
...
at java.base/java.lang.Thread.run(Thread.java:834)
这个问题可能会影响到其他用户,也同样报告了类似的问题,即使在没有第三方插件的标准安装中也会出现。
问题分析
根据错误信息和您提供的背景,我们可以推测出几个可能的原因:
-
TLS 协议版本问题:您的配置中可能在不同时间使用了不同版本的 TLS 协议(如 TLS 1.2 和 TLS 1.3),这可能导致握手过程中出现不一致。
-
证书配置问题:证书中是否定义了
SubjectAlternativeName
。这个字段应该包含服务器的域名,以确保 SSL 验证能够顺利通过。 -
JVM 版本问题:JDK 可能存在某些版本上的已知问题(例如 JDK-8214060),升级 JVM 可能会解决此问题。
-
okhttp3 库版本冲突:SonarQube 及其第三方插件使用了不同版本的
okhttp3
库,可能会导致类路径问题,从而引发间歇性错误。
解决方案
1. 强制使用特定版本的 TLS 协议
您可以在配置文件中指定使用特定版本的 TLS 协议(如 TLS 1.2 或 TLS 1.3)。确保整个系统在所有连接过程中使用相同的 TLS 版本。
java
OkHttpClient client = new OkHttpClient.Builder()
.sslSocketFactory(sslSocketFactory, trustManager)
.build();
2. 检查证书的 SubjectAlternativeName
确保您的证书中包含 SubjectAlternativeName
,并且该字段正确地定义了服务器的域名。如果证书中缺少这个字段,可能会导致 SSL 验证失败。
3. 升级 JVM
如果您使用的 JVM 版本较旧,建议升级到较新的版本,以避免已知的 SSL/TLS 问题。例如,OpenJDK 11.0.0.2 升级到 11.0.0.6 可能会解决该问题。
bash
sudo apt-get install openjdk-11-jdk
4. 确保使用最新版本的 okhttp3
库
检查并确保所有使用 okhttp3
库的组件和插件都使用了最新版本,以避免由于版本不一致导致的类路径问题。
示例配置
假设您的 SonarQube 配置文件如下,您可以在其中添加或修改相关的配置以确保使用特定的 TLS 版本和升级 JVM。
yaml
sonar.security.realm: LDAP
ldap.url: ldap://localhost:10389
ldap.bindDn: uid=admin,ou=system
ldap.bindPassword: secret
sonar.authenticator.downcase: true
sonar.core.serverBaseURL: http://your-sonarqube-server
sonar.ce.javaOpts: -Djavax.net.ssl.keyStore=/path/to/keystore -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.trustStore=/path/to/truststore -Djavax.net.ssl.trustStorePassword=changeit -Dhttps.protocols=TLSv1.2
总结
间歇性的 SSLPeerUnverifiedException
问题可能由于多个原因引起,本文提供了几种潜在的解决方案。通过强制使用特定版本的 TLS 协议、确保证书配置正确、升级 JVM 和使用最新版本的 okhttp3
库,您可以显著减少或解决这个问题。
希望这些建议能帮助您解决问题。如果有进一步的问题或需要更详细的帮助,请随时联系。