https调用接口SSLException:Unrecognized SSL message, plaintext connection?

异常:cn.hutool.core.io.IORuntimeException: SSLException: Unrecognized SSL message, plaintext connection?

环境:客户端调用服务端的https接口,出现SSL异常。server: openjdk version "1.8.0_212" .

客户端 hutool: 5.7.16, openjdk version "1.8.0_111" .调用服务端的时候有异常
但是当我换一个客户端:hutool: 5.7.16, openjdk version "1.8.0_202"   并不会报错。代码完全一致
怀疑是jdk版本的问题。但是不确定。

部分异常如下:

cn.hutool.core.io.IORuntimeException: SSLException: Unrecognized SSL message, plaintext connection?
at cn.hutool.http.HttpRequest.send(HttpRequest.java:1198)
at cn.hutool.http.HttpRequest.doExecute(HttpRequest.java:1076)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:967)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:943)
at com.jmc.center.dms.util.AbstractHttpClient.postJson(AbstractHttpClient.java:117)
cn.hutool.core.io.IORuntimeException: SSLException: Unrecognized SSL message, plaintext connection?
at cn.hutool.http.HttpRequest.send(HttpRequest.java:1198)
at cn.hutool.http.HttpRequest.doExecute(HttpRequest.java:1076)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:967)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:943)
at com.jmc.center.dms.util.AbstractHttpClient.postJson(AbstractHttpClient.java:117)
cn.hutool.core.io.IORuntimeException: SSLException: Unrecognized SSL message, plaintext connection?
at cn.hutool.http.HttpRequest.send(HttpRequest.java:1198)
at cn.hutool.http.HttpRequest.doExecute(HttpRequest.java:1076)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:967)
at cn.hutool.http.HttpRequest.execute(HttpRequest.java:943)
at com.jmc.center.dms.util.AbstractHttpClient.postJson(AbstractHttpClient.java:117)

请教各位有什么想法?环境不让随便动,除非能确定问题。

原因如下:
1.服务端部署的服务未配置SSL监听端口,也就是http访问形式,但是你用了https访问。
2.如果配置了SSL信息,但是用不了,检查下域名是否备案、nginx里是不是配置了域名证书、是否配置了SSL模式等

【以下回答由 GPT 生成】

根据您提供的信息,问题可能与Java版本相关,其中OpenJDK 1.8.0_111和OpenJDK 1.8.0_202可能会导致不同的行为。

我建议您尝试以下解决方案:

  1. 升级Java版本: 可以尝试升级到OpenJDK 1.8.0_202或更高版本,以获取更好的兼容性和安全性。升级Java版本可能需要与您的环境进行额外的测试和验证,以确保与其他组件和应用程序的兼容性。

  2. 检查证书: 确保您的HTTPS服务端配置了有效的SSL证书。如果证书无效或过期,可能会导致此错误。您可以使用Java密钥库(JKS)格式的证书,并在代码中指定信任的证书。

下面是一个示例代码片段,显示如何在Hutool中加载和使用Java密钥库(JKS)格式的证书:

SSLContext sslContext = SSLContextBuilder.create()
        .loadKeyMaterial(ResourceUtils.getFile("classpath:keystore.jks"), "password".toCharArray(), "password".toCharArray())
        .loadTrustMaterial(ResourceUtils.getFile("classpath:truststore.jks"), "password".toCharArray())
        .build();

SSLFactory sslFactory = SSLFactoryBuilder.create()
        .setSslContext(sslContext)
        .setVerifyHostname(false) // 可根据实际情况设置是否验证主机名
        .build();

HttpRequest httpRequest = HttpUtil.createGet("https://example.com");
httpRequest.setSSLFactory(sslFactory);

HttpResponse response = httpRequest.execute();

请注意修改: - keystore.jks:包含客户端证书的Java密钥库路径 - password:Java密钥库的密码 - truststore.jks:包含信任的证书链的Java信任库的路径

这只是一个示例,您需要根据您的实际情况进行修改。

  1. 检查服务端配置: 确保您的HTTPS服务端已正确配置,并且支持TLS协议。客户端与服务端之间的TLS协议版本和加密算法应该是兼容的。您可以检查服务端的日志和配置文件,确保服务端正常工作,并与客户端的要求相匹配。

如果您无法升级Java版本或修改配置,并且没有其他信息可以提供,那么我无法提供更具体的解决方案。请尝试联系您的IT部门或相关技术支持,以便他们能够提供更好的帮助。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^