javax.net.ssl.SSLException: protocol_version报错怎么排查与配置?
问题解答
1. https.protocols 配置归属
该系统属性属于客户端侧配置,仅作用于Java进程作为客户端发起SSL/TLS连接时的协商逻辑:你提到的System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2");是指定本地Java客户端向外发起连接时,允许使用的TLS协议版本白名单,避免客户端默认支持的协议版本不在服务端允许范围内,导致协商失败抛出protocol_version错误。
如果需要调整服务端支持的TLS协议版本,无需使用该属性,不同服务端容器(Tomcat、Netty、Jetty等)都有独立的SSL配置项指定允许的协议版本。
2. 两端TLS协议版本查询方法
2.1 Java客户端查询
- 代码层面查询:可以直接打印当前运行环境支持的协议列表:
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLParameters; import java.util.Arrays; public class TlsVersionCheck { public static void main(String[] args) throws Exception { SSLContext context = SSLContext.getDefault(); SSLParameters params = context.getDefaultSSLParameters(); // 输出当前客户端默认支持的所有TLS协议版本 System.out.println("Supported TLS protocols: " + Arrays.toString(params.getProtocols())); } }
- 运行中进程查询:通过Wireshark抓包,查看客户端发起的
Client Hello报文中的Supported Versions字段,就是客户端实际对外宣告支持的所有协议版本;协商成功后的Server Hello报文中的版本字段就是本次连接实际使用的协议版本。
2.2 服务端查询
- 命令行探测:使用openssl工具即可批量探测服务端支持的所有TLS版本,示例命令:
# 替换为实际的服务端域名和端口 # 探测TLSv1.2支持情况 openssl s_client -connect example.com:443 -tls1_2 # 探测TLSv1.1支持情况 openssl s_client -connect example.com:443 -tls1_1 # 探测TLSv1支持情况 openssl s_client -connect example.com:443 -tls1
如果命令执行后成功建立SSL连接,说明服务端支持对应版本的TLS协议。
- 配置查询:直接查看服务端的SSL配置文件即可确认允许的协议列表,比如Tomcat在server.xml的Connector节点配置
sslEnabledProtocols属性,Spring Boot服务可在配置文件中查看server.ssl.enabled-protocols配置项。
内容的提问来源于stack exchange,提问作者Stefano Maglione
相关产品推荐
相关产品推荐

