通过curl请求示例详解HTTPS协议

基于HTTPS通信是当前互联网最通用便捷的通信方式,简单理解来看可以视为HTTP协议 + SSL/TLS协议,通过一个curl的示例阐述一下HTTPS协议。

特性:

  • 信息加密传输,防止窃听风险
  • 具有校验机制,防止篡改风险
  • 配备身份证书,防止冒充风险

版本变更

  • SSL1.0 1994年,未发布
  • SSL2.0 1995年,有严重漏洞
  • SSL3.0 1996年,大规模应用,有风险现在不建议
  • TLS1.0 1999年(别称SSL3.1)
  • TLS1.1 2006年(别称SSL3.2)
  • TLS1.2 2008年,2011年修订(别称SSL3.3)

原理

公钥放在数字证书,验证证书可信,即公钥可信,采用公钥加密,服务器收到后,私钥解密,考虑到加密计算量,公钥将对话密钥加密,而其他的信息则采用对话密钥进行对称加密,尽量提升性能。

  • 客户端向服务端索要并验证公钥
  • 双方生成“对话密钥”
  • 双方采用对话密钥加密通信

curl分析HTTPS请求时间

HTTPs耗时 = TCP握手 + SSL握手, 因为涉及到一些加密,及多了几次握手交互,可以看到的时要多于平常时间的3-5倍,当然这个和机器性能相关。

curl -w "TCP handshake: %{time_connect}, SSL handshake: %{time_appconnect}\n" -so /dev/null https://www.baidu.com
TCP handshake: 0.005, SSL handshake: 0.026

curl分析HTTPS请求过程

curl –trace 命令 可以记录请求的详情,我们就用它来了解一下https整个过程,命令如下:

curl -kv -1 --trace temp.txt 'https://www.baidu.com'
  • 客户端请求ClientHello

客户端主要向服务器提供以下信息:
1. 支持的协议版本,比如TLS 1.0版。
2. 一个客户端生成的随机数,稍后用于生成”对话密钥”。
3. 支持的加密方法,比如RSA公钥加密。
4. 支持的压缩方法。

curl第一步请求如下

== Info: SSLv3, TLS handshake, Client hello (1):
<= Send SSL data, 84 bytes (0x54)
0000: 01 00 00 50 03 01 5a 39 c4 54 cc f0 0c ed a6 7f ...P..Z9.T.....
0010: 0d a1 ee 69 13 cd dc 09 c8 e6 c6 89 1e 63 b2 8b ...i.........c..
0020: 3e d5 52 a2 be 4e 00 00 28 00 39 00 38 00 35 00 >.R..N..(.9.8.5.
0030: 16 00 13 00 0a 00 33 00 32 00 2f 00 05 00 04 00 ......3.2./.....
0040: 15 00 12 00 09 00 14 00 11 00 08 00 06 00 03 00 ................
0050: ff 02 01 00      
  • 服务端响应SeverHello

服务器的回应包含以下内容:
1. 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
2. 一个服务器生成的随机数,稍后用于生成”对话密钥”。
3. 确认使用的加密方法,比如RSA公钥加密。
4. 服务器证书。

还有一种形式是服务端会校验客户端的证书,比如金融类一般金融机构以前网银key即包含一张客户端证书

  • 客户端回应
  1. 一个随机数。该随机数用服务器公钥加密,防止被窃听。
  2. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  3. 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

三个随机数,生成会话密钥。 此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。

== Info: SSLv3, TLS change cipher, Client hello (1):
<= Send SSL data, 1 bytes (0x1)
0000: 01                                              .
== Info: SSLv3, TLS handshake, Finished (20):
<= Send SSL data, 16 bytes (0x10)
0000: 14 00 00 0c eb 56 cc 54 85 f8 b4 18 ac db 65 d1 .....V.T......e.
  • 服务器的最后回应
  1. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
  2. 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
== Info: SSLv3, TLS handshake, Finished (20):
<= Recv SSL data, 16 bytes (0x10)
0000: 14 00 00 0c 6b f7 be 86 e4 b1 3a 06 47 37 bd ae ....k.....:.G7..
== Info: SSL connection using AES128-SHA
== Info: Server certificate:
== Info:     subject: /C=CN/ST=beijing/L=beijing/O=BeiJing Baidu Netcom Science Technology Co., Ltd/OU=service operation department./CN=baidu.com
== Info:     start date: 2017-06-29 00:00:00 GMT
== Info:     expire date: 2018-08-17 23:59:59 GMT
== Info:     subjectAltName: www.baidu.com matched
== Info:     issuer: /C=US/O=Symantec Corporation/OU=Symantec Trust Network/CN=Symantec Class 3 Secure Server CA - G4
== Info: SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway.

curl整个请求过程:

参考:SSL/TLS协议运行机制的概述

0条留言