작성일: 2024년 6월 4일
Network Traffic을 다루는 앱을 개발하다보면, TLS 또는 HTTPS로 암호화한 통신 내용을 봐야 할 때가 있다.
원칙적으로는 TLS 통신에서 제3자가 패킷 내용을 열람하는 것이 불가능하지만,
내 PC에 저장된 Master Secret 값을 이용하면 복호화가 가능하다. (내 PC는 제3자가 아니니까 이런 복호화가 가능한 얘기가 된다)
참고: 3가지 복호화 방법
Master Secret 값을 이용하는 경우 외에도 TLS Payload를 복호화(Decryption)하는 방법이 있다.
Wireshark 매뉴얼에 보면, Master Secret을 포함하여 총 3가지 방법을 소개하고 있다.
방법 A : (Pre)-Master Secret 정보가 담겨있는 Key load file을 사용하여 복호화하기
이 방법이 범용적으로 사용되는 복호화 방법.
Diffie-Hellman(DH) Key 교환이 발생하더라도 (Pre)-Master Secret 정보를 이용하면 복호화가 된다.
이 블로그의 대부분 내용이 이 방식으로 복호화하는 방법이 설명되어 있다.
방법 B : RSA private key (예: PEM 포맷의 private key 파일)을 이용하여 복호화하기
TLS 연동할 Peer 노드(예: 서버)의 RSA private key를 한번만 Wireshark에 등록하면 되므로 가장 편하게 설정할 수 있다.
단, 아래와 같이 조건을 모두 만족하는 경우에만 RSA private key를 사용하여 복호화하는 것이 가능하다.
- 조건1: Cipher suite가 (EC)DHE 계열이 아니어야 한다.
- 조건2: TLS 1.0 ~ 1.2만 허용됨. TLS 1.3에서는 복호화할 수 없음.
- 조건3: Wireshark에 등록할 Private key는 반드시 Server certificate이어야 한다. client certificate 또는 CA(Certificate Authority) certificate은 안 된다.
- 조건4: TLS handshake 절차에서 'ClientKeyExchange' 과정이 포함되어야 함
즉, 위 4가지 조건을 모두 만족해야 햐는데 현실적으로 요즘 TLS 통신 환경에서 RSA private key를 이용하여 복호화하는 것이 거의 어렵다는 뜻 ㅠㅠ
방법 C : Pre-Shared-Key(PSK) 정보를 이용하여 복호화하기
수준 높은 보안을 요구하는 곳에서 PSK를 사용하지 않고,
PSK를 사용하는 것이 흔한 경우가 아니니까, 설명을 생략~
그렇다면, Master Secret이라는게 무엇이길래 패킷 복호화가 가능한 것일까?
만약 Server / Client 간 통신이 mTLS 방식으로 연결된다면, 아래와 같이 절차를 따를 것이다.
- Client는 Server certificate을 받아서 믿을만한 Network peer인지 확인 (즉, Root CA가 서명한 Certificate인지 확인)
- Server는 Client certificate을 받아서 믿을만한 Network peer인지 확인
- 서로 믿을만하다고 판단되면, 대칭키 교환 (여기서 교환한 대칭키는 Server, Client가 패킷을 암호화 및 복호화 할 때 사용)
- Server, Client가 서로 암호화한 패킷을 주고, 받을 쪽에서는 패킷을 받으면 복호화 처리 (이 때 대칭키를 사용함)
위 mTLS 핸드쉐이킹 절차 3번에서 교화한 대칭키만 있으면, Server / Client 간에 주고 받은 암호화된 HTTPS(또는 TLS) 패킷을 복호화할 수 있다.
이론적으로는 위와 같고, 실제로 Chrome browser 또는 Firefox browser로 HTTPS 패킷을 보내고 받은 내용을 복호화하려면 아래와 같이 해야 한다.
##
## Firefox 브라우저로 테스트할 때.
##
$ export SSLKEYLOGFILE=/tmp/sslkey.log
$ open /Applications/Firefox.app
##
## Chrome 브라우저로 테스트할 때.
##
$ export SSLKEYLOGFILE=/tmp/sslkey.log
$ open /Applications/Google\ Chrome.app
Wireshark을 macOS에서 실행한 경우, 아래의 순서로 설정 화면을 열어 본다.
[ Wireshark ] -> [ Preferences ] -> [ Protocols ] -> [ TLS ] -> [ (Pre)-Master-Secret log filename ]
위 순서로 설정 화면을 오픈하고, 아래 예시 화면처럼 Master-Secret log 파일 경로를 입력하면 된다.
[ OK ] 버튼을 클릭하고, Firefox 브라우저에서 웹 브라우징을 해보면
TLS의 Payload가 눈으로 볼 수 있는 HTTP Payload로 복호화된 것을 확인할 수 있다.
참고: 위와 동일한 내용이지만 원문을 읽고 싶다면, 아래 문서 링크를 클릭할 것 !
https://wiki.wireshark.org/TLS#using-the-pre-master-secret
'Network' 카테고리의 다른 글
Kubernetes CNI Benchmark: Cilium + eBPF 성능 측정 결과 (0) | 2024.11.17 |
---|---|
Network performance with XDP and eBPF (0) | 2024.07.16 |
[Study] High-speed packet capture, filtering - PF_RING, ZC(Zero Copy) (0) | 2024.04.02 |
Ubuntu 22.04에 PPTP 서버 설치하기 (0) | 2024.02.20 |
ip link 명령으로 macvlan network interface 만들기 (0) | 2024.02.09 |