TLS 1.3 with Wireshark
TLS
HTTPS 복습 with TLS 1.2 feat. RSA
HTTPS(HTTP Secure)는 HTTP 프로토콜에 SSL/TLS 암호화를 추가하여 보안성을 강화한 프로토콜이다.
HTTPS는 웹 브라우저와 웹 서버 간의 통신을 암호화하여 제3자가 통신 내용을 도청하거나 조작하는 것을 방지하기 위한 장치이다.
이미지 참고: https://prod-files-secure.s3.us-west-2.amazonaws.com/da29a764-c3f4-4c2d-a877-3d3f432b361e/42d68503-260d-4659-8aef-77cac8893bb2/image.png
글 참고: https://blog.bytebytego.com/p/how-does-https-work-episode-6
HTTPS에서는 데이터가 어떻게 오갈까?
1. “TCP Handshake”: 클라이언트(브라우저)와 서버가 TCP 연결을 설정한다.
2. “인증서 확인” #TLS_HANDSHAKE #1.2
1. 클라이언트가 서버에 “client hello” 메시지를 보낸다.
- 이 메시지에는 필요한 암호화 알고리즘들(cipher suites)과 지원할 수 있는 최신 TLS 버전이 포함되어 있다.
2. 서버는 “server hello” 메시지로 응답하여 브라우저가 해당 알고리즘과 TLS 버전을 지원할 수 있는지 알 수 있게 해준다.
3. 그 후 서버는 인증서를 클라이언트에게 보낸다.
- 인증서에는 공개 키, 호스트명, 만료일 등이 포함되어 있다.
4. “Server Hello Done”을 통해 클라한테 서버의 Hello 절차가 끝남을 알린다.
5. 클라이언트는 인증서를 검증한다.
- 이 검증 과정에서 클라이언트는 인증서가 신뢰할 수 있는 인증 기관(CA)에 의해 서명되었는지 확인하고, 인증서의 유효성을 검토한다.
3. “Key Exchange” #RSA방식
1. SSL 인증서가 검증된 후,
클라이언트는 세션 키를 생성하고 이를 공개 키를 사용해 암호화한다.
2. 서버는 암호화된 세션 키를 받아 개인 키로 이를 복호화한다.
3. 클라이언트는 서버에게 "Change Cipher Spec" 메시지를 전송하여 앞으로의 통신이 새로 생성된 세션 키로 암호화됨을 알린다.
4. “데이터 전송”: 이제 클라이언트와 서버는 동일한 세션 키(대칭 암호화)를 가지게 되며, 암호화된 데이터는 안전한 양방향 채널을 통해 전송된다!
RSA는 TLS 1.3부터 지원되지 않는다!
위키: https://en.wikipedia.org/wiki/Transport_Layer_Security
위에서 Key를 교환하기 위해서 설명한 방식은 RSA 기반이다. 랜덤 번호를 설정해서 RSA로 교환했다. 하지만 이것보다 더 안전한 방식으로 디피-헬만(Diffie-Hellman) 알고리즘이 있다.
디피-헬만 알고리즘은 키를 네트워크 상에서 전송하는 것을 피하기 때문에 서버 인증서에 포함된 공개키를 반드시 필요로 하지는 않는다. 대신, 이 알고리즘은 클라이언트와 서버가 동일한 세션 키를 서로 공유할 수 있도록 하고 이 과정에서 키가 네트워크를 통해 직접 전송되지 않는다.
물론, 서버 인증서는 여전히 클라이언트가 통신하고 있는 서버의 신원을 검증할 때 필수로 쓰인다.
TLS 1.3 Handshake
TLS 1.3은 TLS 1.2는 두번의 RTT를 거치는 것을 개선한 느낌이다. 그래서 좀 더 복잡한데 직접 캡처를 해봤다.
TLS 1.3 데모
Flow
1. 이전에 접속했던 swagger 페이지에 접속
2. 페이지에서 api 요청 보내기
Packet Flow Graph
Decrypted HTTPS Response
|Time | 192.168.50.216 |
| | | 152.67.x.x |
|3.324066 | 58613 → https(443) [ |TCP: 58613 → https(443) [SYN, ECE, CWR] Seq=0 Win=65535 Len=0 MSS=1460 WS=64 TSval=438821032 TSecr=0 SACK_PERM
| |(58613) ------------------> (443) |
|3.330283 | https(443) → 58613 [ |TCP: https(443) → 58613 [SYN, ACK, ECE] Seq=0 Ack=1 Win=62636 Len=0 MSS=8960 SACK_PERM TSval=212206006 TSecr=438821032 WS=128
| |(58613) <------------------ (443) |
|3.330384 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=1 Ack=1 Win=131712 Len=0 TSval=438821038 TSecr=212206006
| |(58613) ------------------> (443) |
|3.330754 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=1 Ack=1 Win=131712 Len=1448 TSval=438821038 TSecr=212206006 [TCP PDU reassembled in 33]
| |(58613) ------------------> (443) |
|3.330770 | Client Hello (SNI=ap |TLSv1.3: Client Hello (SNI=api.xxx.com)
| |(58613) ------------------> (443) |
|3.338901 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=1 Ack=1806 Win=60928 Len=0 TSval=212206015 TSecr=438821038
| |(58613) <------------------ (443) |
|3.338903 | Server Hello, Change |TLSv1.3: Server Hello, Change Cipher Spec, Encrypted Extensions, Finished
| |(58613) <------------------ (443) |
|3.339003 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=1806 Ack=245 Win=131520 Len=0 TSval=438821047 TSecr=212206016
| |(58613) ------------------> (443) |
|3.339203 | Change Cipher Spec, |TLSv1.3: Change Cipher Spec, Finished
| |(58613) ------------------> (443) |
|3.339378 | GET /docs/swagger-ui |HTTP: GET /docs/swagger-ui-standalone-preset.js HTTP/1.1
| |(58613) ------------------> (443) |
|3.347343 | New Session Ticket |TLSv1.3: New Session Ticket
| |(58613) <------------------ (443) |
|3.347418 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=2983 Ack=324 Win=131392 Len=0 TSval=438821055 TSecr=212206023
| |(58613) ------------------> (443) |
|3.349621 | HTTP/1.1 304 Not Mod |HTTP: HTTP/1.1 304 Not Modified
| |(58613) <------------------ (443) |
|3.349749 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=2983 Ack=995 Win=130752 Len=0 TSval=438821058 TSecr=212206024
| |(58613) ------------------> (443) |
|3.364956 | GET /docs/swagger-ui |HTTP: GET /docs/swagger-ui-init.js HTTP/1.1
| |(58613) ------------------> (443) |
|3.374036 | HTTP/1.1 304 Not Mod |HTTP: HTTP/1.1 304 Not Modified
| |(58613) <------------------ (443) |
|3.374229 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=4048 Ack=1579 Win=130432 Len=0 TSval=438821082 TSecr=212206051
| |(58613) ------------------> (443) |
|6.778025 | GET /api/v1/rooms HT |HTTP: GET /api/v1/rooms HTTP/1.1
| |(58613) ------------------> (443) |
|6.826598 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=1579 Ack=5006 Win=57856 Len=0 TSval=212209503 TSecr=438824486
| |(58613) <------------------ (443) |
|6.869363 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=1579 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869366 | https(443) → 58613 [ |TCP: https(443) → 58613 [PSH, ACK] Seq=3027 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869368 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=4475 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869369 | https(443) → 58613 [ |TCP: https(443) → 58613 [PSH, ACK] Seq=5923 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869370 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=7371 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869372 | https(443) → 58613 [ |TCP: https(443) → 58613 [PSH, ACK] Seq=8819 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869373 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=10267 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869375 | https(443) → 58613 [ |TCP: https(443) → 58613 [PSH, ACK] Seq=11715 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869376 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=13163 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869378 | https(443) → 58613 [ |TCP: https(443) → 58613 [PSH, ACK] Seq=14611 Ack=5006 Win=57856 Len=1448 TSval=212209544 TSecr=438824486 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.869572 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=5006 Ack=16059 Win=116544 Len=0 TSval=438824578 TSecr=212209544
| |(58613) ------------------> (443) |
|6.869767 | [TCP Window Update] |TCP: [TCP Window Update] 58613 → https(443) [ACK] Seq=5006 Ack=16059 Win=131072 Len=0 TSval=438824578 TSecr=212209544
| |(58613) ------------------> (443) |
|6.877040 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=16059 Ack=5006 Win=57856 Len=1448 TSval=212209553 TSecr=438824578 [TCP PDU reassembled in 1509]
| |(58613) <------------------ (443) |
|6.877042 | [TLS segment of a re |TLSv1.3: [TLS segment of a reassembled PDU]
| |(58613) <------------------ (443) |
|6.877043 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=18955 Ack=5006 Win=57856 Len=1448 TSval=212209553 TSecr=438824578 [TCP PDU reassembled in 1511]
| |(58613) <------------------ (443) |
|6.877044 | HTTP/1.1 200 OK , JS |HTTP/JSON: HTTP/1.1 200 OK , JSON (application/json)
| |(58613) <------------------ (443) |
|6.877131 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=5006 Ack=20855 Win=126272 Len=0 TSval=438824585 TSecr=212209553
| |(58613) ------------------> (443) |
|6.877221 | [TCP Window Update] |TCP: [TCP Window Update] 58613 → https(443) [ACK] Seq=5006 Ack=20855 Win=131072 Len=0 TSval=438824585 TSecr=212209553
| |(58613) ------------------> (443) |
|9.222007 | GET /api/v1/rooms HT |HTTP: GET /api/v1/rooms HTTP/1.1
| |(58613) ------------------> (443) |
|9.229979 | https(443) → 58613 [ |TCP: https(443) → 58613 [ACK] Seq=20855 Ack=6017 Win=56960 Len=0 TSval=212211906 TSecr=438826930
| |(58613) <------------------ (443) |
|9.238852 | HTTP/1.1 304 Not Mod |HTTP: HTTP/1.1 304 Not Modified
| |(58613) <------------------ (443) |
|9.238941 | 58613 → https(443) [ |TCP: 58613 → https(443) [ACK] Seq=6017 Ack=21439 Win=130432 Len=0 TSval=438826947 TSecr=212211915
| |(58613) ------------------> (443) |
filter: `ip.host == 152.67.x.x or ip.dst_host == 152.67.x.x`
댓글
이 글 공유하기
다른 글
-
리눅스에서 호스팅 중인 서비스가 외부로부터 접속이 안 될 때 문제 확인 방법
리눅스에서 호스팅 중인 서비스가 외부로부터 접속이 안 될 때 문제 확인 방법
2022.11.04 -
Email Protocol 비교 :: POP3, IMAP, SMTP
Email Protocol 비교 :: POP3, IMAP, SMTP
2020.03.21 -
DigitalOcean으로 네트워크 실습용 서버 만들기
DigitalOcean으로 네트워크 실습용 서버 만들기
2020.02.29