报错protocol_version
2022-05-19 15:11:56 [ERROR] com.cipherxxx.utils.HttpsClientUtils - javax.net.ssl.SSLException: Received fatal alert: protocol_version
排查原因
在Java 1.8上,默认TLS协议是v1.2。在Java 1.6和1.7上,默认是已废弃的TLS1.0,由于此项目使用的是jdk1.6,因此引发错误。
-------------------------------------------------------------
服务端的TLS配置和客户端请求时的TLS不一致
服务端Nginx配置:ssl_protocols TLSv1.2
但因JDK是JDK1.7,客户端请求时,设置new String[]{"TLSv1"},所以报以上错误
-----------------------------------------------------------
有两种解决方法:
第一种解决办法
服务端修改:修改支持TLSv1.0 TLSv1.1 TLSv1.2
如果是使用Nginx的,修改Nginx配置文件nginx.conf,支持TLSv1.0 TLSv1.1 TLSv1.2
例如:
# 指定支持的协议,这里表示支持1、1.1和1.2, 如果只写1.2表示仅支持1.2. 注:OpenSSL版本要求 >= 1.0.1
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
参考:https://blog.csdn.net/wq_14365327/article/details/121931339
第二种解决办法:
客户端修改:JDK配置JDK1.8以上,并修改请求方式
SSLConnectionSocketFactory sslCsf = new SSLConnectionSocketFactory(
sslcontext,
new String[]{"TLSv1.2"}, -->修改跟服务端一直TLS1.2
null,
NoopHostnameVerifier.INSTANCE);
httpClient=HttpClients.custom()
.setSSLSocketFactory(sslCsf)
.build();
还有另外一种解决方法:客户端忽略tls验证,不过这种方法不安全。
参考:https://blog.csdn.net/jungeCSND/article/details/124009231