日常 - HttpURLConnection 网络请求 TLS 1.2


环境

JDK 8
Hutool 4.5.1

前言

应供应商 DD 的 TLS 版本升级通知,企业版接口升级后 TLS 1.0 及 1.1 版本请求将无法连接,仅支持 TLS 1.2 及以上版本的客户端发起请求。

当前项目使用 Hutool 的 HttpUtil 作为客户端,而该客户端本质就是对 JDK HttpURLConnection 的封装,因此,也就是要判断 JDK 8 是否支持 TLS 1.2。

HTTPS 请求流程

Client Server https 请求 https://www.baidu.com/ TCP 三次握手 SYN SYN + ACK ACK 服务端 TLS 信息 Client Hello(发送客户端随机数、支持的 TLS 版本、加密算法) Server Hello(服务端随机数、选定的密钥等) Certificate(网站证书 public key) Server Hello Done(服务端消息发送完毕) 客户端证书验证 客户端 TLS 信息 Client Key Exchange(提供客户端密钥交换算法) Change Cipher Spec(切换加密模式) Finished Change Cipher Spec Finished TLS 验证完毕,发送加密应用数据 Client Server

服务端支持

要判断服务端是否支持 TLS 1.2,最简单的方法就是使用浏览器请求下,然后在开发人员工具上查找其安全连接信息,
百度 TLS 1.2
可以看到 https://www.baidu.com 已经支持 TLS 1.2,接下来就该验证 JDK 8 是否支持 TLS 1.2 了。

JDK 验证

首先判断下 JDK 8 支持哪些 HTTPS 的加密协议:

try (SSLServerSocket serverSocket = (SSLServerSocket) SSLServerSocketFactory.getDefault().createServerSocket()) {
    System.out.println("服务器支持的协议");
    for (String protocol : serverSocket.getSupportedProtocols()) {
        System.out.println(protocol);
    }
    System.out.println("服务器启用协议");
    for (String protocol : serverSocket.getEnabledProtocols()) {
        System.out.println(protocol);
    }
}
System.out.println();
try (SSLSocket socket = (SSLSocket) SSLSocketFactory.getDefault().createSocket()) {
    System.out.println("客户端支持的协议");
    for (String protocol : socket.getSupportedProtocols()) {
        System.out.println(protocol);
    }
    System.out.println("客户端启用协议");
    for (String protocol : socket.getEnabledProtocols()) {
        System.out.println(protocol);
    }
}

输出:

服务器支持的协议
TLSv1.3
TLSv1.2
TLSv1.1
TLSv1
SSLv3
SSLv2Hello
服务器启用协议
TLSv1.3
TLSv1.2
SSLv2Hello

客户端支持的协议
TLSv1.3
TLSv1.2
TLSv1.1
TLSv1
SSLv3
SSLv2Hello
客户端启用协议
TLSv1.3
TLSv1.2

可以看到 JDK 8 客户端是启用了 TLSv1.2 的,但如果发送 HTTPS 请求,那 JDK 8 是否会使用呢?

接下来初始化好项目,然后在 HttpRequest#execute#846 断点并执行代码:

String html = HttpUtil.get("https://www.baidu.com");
System.out.println(html);

HttpRequest#execute#846

httpResponse:                          # HttpResponse
  httpConnection:                      # HttpConnection
    conn:                              # HttpURLConnection
      delegate:                        # DelegateHttpsURLConnection
        inputStream:                   # HttpURLConnection$HttpInputStream
          in:                          # ChunkedInputStream
            hc:                        # HttpsClient
              session:                 # SSLSessionImpl
                protocolVersion:       # ProtocolVersion
                  name: "TLSv1.2"

百度 HTML

就可以确定如果服务端启用 TLS 1.2,那么 JDK 8 是可以支持的了。

资源

JDK 8
百度百科 HTTPS
dromara/hutool - 🍬A set of tools that keep Java sweet.
http客户端(Hutool-http)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值