Spring Boot项目连接InfluxDB报SSLHandshakeException错误如何解决
这个报错是因为你的InfluxDB用的是HTTPS协议,服务端部署的SSL证书没有被你运行Spring Boot项目的JVM默认信任库收录,所以SSL握手失败,和你现有PostgreSQL的配置不冲突。
第一个问题:是否需要额外编写配置类?
默认的Spring Boot InfluxDB自动配置仅支持标准受信任SSL证书的HTTPS连接,如果你用的是自签名证书或者私有CA颁发的证书,确实需要额外编写自定义配置类,或者调整JVM信任库配置。
解决方案分两种场景:
场景1:本地开发/测试环境(快速验证,不推荐生产使用)
直接自定义InfluxDB配置类,跳过SSL证书校验:
import okhttp3.OkHttpClient; import org.influxdb.InfluxDB; import org.influxdb.InfluxDBFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager; import java.security.cert.X509Certificate; @Configuration public class InfluxDBConfig { @Value("${spring.influx.url}") private String influxUrl; @Value("${spring.influx.user}") private String username; @Value("${spring.influx.password}") private String password; @Bean public InfluxDB influxDB() throws Exception { // 构建信任所有证书的SSL上下文 TrustManager[] trustAllCerts = new TrustManager[]{ new X509TrustManager() { public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; } public void checkClientTrusted(X509Certificate[] certs, String authType) {} public void checkServerTrusted(X509Certificate[] certs, String authType) {} } }; SSLContext sslContext = SSLContext.getInstance("SSL"); sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder() .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustAllCerts[0]) .hostnameVerifier((hostname, session) -> true); return InfluxDBFactory.connect(influxUrl, username, password, clientBuilder); } }
这个配置会覆盖Spring Boot自动配置的InfluxDB实例,跳过所有SSL校验,可快速验证业务逻辑是否正常。
场景2:生产环境(安全合规方案)
将InfluxDB的SSL证书导入到运行服务的JVM信任库中,步骤如下:
- 导出InfluxDB服务端的SSL证书,执行命令:
openssl s_client -connect <你的InfluxDB域名>:<端口> < /dev/null | sed -n '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/p' > influxdb.crt - 将证书导入JDK默认信任库,执行命令(注意替换你的JDK路径):
keytool -importcert -file ./influxdb.crt -alias influxdb -keystore $JAVA_HOME/jre/lib/security/cacerts
默认信任库密码为changeit,导入时按提示输入密码并确认信任证书即可。 - 重启Spring Boot服务,即可正常建立SSL连接。
额外注意事项
你当前代码存在一处逻辑错误:实体类MMEntity上的@Measurement(name = "M_M_TEST")注解指定的测量名是M_M_TEST,但你Service层查询语句写的是SELECT * FROM M_M LIMIT 10,测量名不一致,SSL问题解决后需要修改统一,否则会返回空数据。
内容的提问来源于stack exchange,提问作者guidop21
相关产品推荐
相关产品推荐

