Linux网络之HTTPS解析

一、利用openssl建立SSL测试环境

为了对SSL协议有大致的了解,我们可以通过openssl命令来建立一个SSL测试环境。

1. 建立自己的CA

在openssl安装目录的misc目录下(或者在apps目录下),运行脚本:./CA.sh -newca(Windows环境下运行:perl ca.pl –newca),出现提示符时,直接回车。运行完毕后会生成一个demonCA的目录,里面包含了ca证书及其私钥。

2. 生成客户端和服务端证书申请:

1
2
$ openssl req -newkey rsa:1024 -out req1.pem -keyout sslclientkey.pem
$ openssl req -newkey rsa:1024 -out req2.pem -keyout sslserverkey.pem

3. 签发客户端和服务端证书

1
2
$ openssl ca -in req1.pem -out  sslclientcert.pem
$ openssl ca -in req2.pem -out sslservercert.pem

4. 运行ssl服务端和客户端:

1
2
$ openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3
$ openssl s_client -ssl3 -CAfile demoCA/cacert.pem

5. 运行客户端程序后,如果正确,会打印类似如下内容:

1
2
3
4
5
6
7
8
9
10
SSL-Session:
Protocol : SSLv3
Cipher : DHE-RSA-AES256-SHA
Session-ID: A729F5845CBFFBA68B27F701A6BD9D411627FA5BDC780264131EE966D1DFD6F5
Session-ID-ctx:
Master-Key: B00EEBD68165197BF033605F348A91676E872EB48487990D8BC77022578EECC0A9789CD1F929E6A9EA259F9F9F3F9DFA
Key-Arg : None
Start Time: 1164077175
Timeout : 7200 (sec)
Verify return code: 0 (ok)

此时,输入数据然后回车,服务端会显示出来。

命令的其他选项:

  • a) 验证客户端证书
    1
    2
    $ openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 1
    $ openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem
  • b) 指定加密套件
    1
    2
    $ openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 1
    $ openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem -cipher AES256-SHA
    其中AES256-SHA可用根据openssl ciphers命令获取,s_server也可用指明加密套件:
    1
    $ openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 1 -cipher AES256-SHA
  • c) 指定私钥加密口令
    1
    2
    $ openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile demoCA/cacert.pem -ssl3 -Verify 3 -cipher AES256-SHA -pass pass:123456
    $ openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem -pass pass:123456
    • 用参数pass给出私钥保护口令来源:
      1
      2
      3
      4
      -pass file:1.txt   (1.txt的内容为加密口令123456)
      -pass env:envname (环境变量)
      -pass fd:fdname
      -pass stdin
      比如:
      1
      $ openssl s_client -ssl3 -CAfile demoCA/cacert.pem -cert sslclientcert.pem -key sslclientkey.pem -pass stdin
      然后输入口令123456即可。

二、Wireshark解密SSL流量

Wireshark 的抓包原理是直接读取并分析网卡数据,要想让它解密 HTTPS 流量,有两个办法:1)如果你拥有 HTTPS 网站的加密私钥,可以用来解密这个网站的加密流量;2)某些浏览器支持将 TLS 会话中使用的对称密钥保存在外部文件中,可供 Wireshark 加密使用。

1. RSA Private Key

  1. 从服务器上导出带私钥的P12格式的证书,或者直接导出服务器的私钥。
  2. 点击编辑——>首选项——>协议——>SSL(有的版本只有TLS),导入RSA key:
  3. 导入服务器证书:打开 Wireshark 的 SSL 协议设置,把 IP、端口、协议和证书私钥都配上(私钥必须存为 PEM 格式)
  4. 点击ok后,Wireshark会对捕获的报文进行解密:可以直观的看到HTTP报文的请求和响应。

2. SSLKEYLOGFILE

Firefox 和 Chrome 都会在系统环境变量存在 SSLKEYLOGFILE 文件路径时,将每个 HTTPS 连接产生的 Premaster Secret 或 Master Secret 存下来。有了这个文件,Wireshark 就可以轻松解密 HTTPS 流量,即使是使用了 ECDHE 这种具有前向安全性的密钥交换。SSLKEYLOGFILE 文件记录的是 HTTPS 数据传输中最重要的加密信息,如果不是出于调试目的,一般也没人会主动配置这个环境变量,所以这个方案基本不会对 HTTPS 安全性产生影响。

  1. 环境变量中新建用户变量SSLKEYLOGFILE=路径\sslkey.log文件,之后再wireshark中ssl配置中制定该文件位置即可。
  2. 点击编辑>首选项>protocol>ssl:在 Wireshark 的 SSL 配置面板的 「(Pre)-Master-Secret log filename」选项中这个文件选上,「SSL debug file」也建议配上,这样解密过程中的日志都会记录下来,便于调试。
  3. 设置完成后即可解密浏览器的访问流量。

参考