概述
- https協議是在http協議的基礎上,使用TLS協議對http數據進行了加密,使得網絡通信更加安全。
- 一般情況下,使用WireShark抓取的https流量,數據都是加密的,無法直接查看。但是可以通過以下兩種方法,解密抓取到的https流量數據。
方法一:通過RSA私鑰解密
-
首先需要下載服務端的RSA證書私鑰文件
-
在WireShark中,選擇
編輯->首選項->RSA密鑰
,然后添加RSA證書私鑰文件。 -
或者選擇
編輯->首選項->Protocols->TLS
, 點擊RSA keys list
后面的編輯按鈕,設置服務端的ip和端口,協議寫http, 再導入RSA私鑰文件。 -
這樣重新抓包,就可以抓到解密后的https流量。
-
這種方法只能解密密鑰協商算法為RSA的加密套件,支持的常用加密套件有以下幾種:
-
TLS_RSA_WITH_AES_256_GCM_SHA384TLS_RSA_WITH_AES_128_GCM_SHA256TLS_RSA_WITH_AES_256_CBC_SHA256TLS_RSA_WITH_AES_128_CBC_SHA256TLS_RSA_WITH_AES_256_CBC_SHATLS_RSA_WITH_AES_128_CBC_SHA
-
-
并且需要拿到RSA證書私鑰,可能不太實用。
方法二:使用密鑰日志文件
-
https流量加密的核心是TLS協議,其握手過程會協商出會話密鑰,用于加密實際傳輸的數據。
-
當客戶端配置了密鑰日志文件后,每次TLS握手完成時,會將會話密鑰等信息寫入指定的日志文件中,這樣WireShark就可以使用日志文件中的會話密鑰等信息解密HTTPS流量數據。
-
如果使用瀏覽器,可配置
SSLKEYLOGFILE
環境變量,指定一個日志文件路徑。如果不生效,可重啟下電腦。-
set SSLKEYLOGFILE=C:\sslpath\sslkeylog.txt
-
-
如果使用C/C++編寫的客戶端程序,可通過OpenSSL接口指定密鑰日志文件
-
void keylog_callback(const SSL *ssl, const char *line) {FILE *keylog = fopen("C:\\sslpath\\sslkeylog.txt", "a");if (keylog) {fprintf(keylog, "%s\n", line);fclose(keylog);}}int main () {SSL_CTX *ctx = SSL_CTX_new(TLSv1_2_client_method());if(ctx == NULL){ERR_print_errors_fp(stderr);return -1;} SSL_CTX_set_keylog_callback(ctx, keylog_callback);return 0;}
-
-
然后在WireShark中選擇
編輯->首選項->Protocols->TLS
, 在(Pre)-Master-Secret log filename
的編輯框中指定日志文件路徑。 -
再重新抓取,依然可以成功解密https流量
-
這種方法幾乎支持所有的加密套件。
-
密鑰日志文件若泄露,可解密所有記錄的HTTPS流量,僅限測試環境使用。
總結
-
通過RSA證書私鑰解密 使用密鑰日志文件 加密套件支持情況 只支持RSA密鑰協商算法的加密套件,不支持ECDH、DH等其他密鑰協商算法的加密套件 幾乎支持所有加密套件 安全性 只支持解密指定服務器的https流程,更加安全 可解密所有的https流量, 密鑰日志文件要謹慎保存 實用性 需要服務端提供證書私鑰, 不太實用 不需要服務端提供證書私鑰,更加實用