티스토리 뷰

golang

gRPC SSL/TLS 2. SSL/TLS 에 대하여

주먹불끈 2019. 7. 1. 11:19

개요

 

 

1) 앞에서 기반이 되는 암호에 대해 간단히 흝어보았고

2) 여기서는 SSL/TLS 동작 원리를 이해하고

3) 마지막으로 gRPC 에서 SSL/TLS 어떻게 다루면 알아보려 한다.

* handshake gRPC 알아서 해준다.

 

HTTPS 에서 어떻게 암호화를 이루어 내는지를 차근히 따라가보자.

클라이언트 (= 브라우저) 서버에 접근하여 간의 안전한 암호 통신 세션을 만드는 것이다.

- 세세하고 정확한 설명보다는 그림으로서 개념 설명을 하려 하였으나 수정이 필요한 부분을 알려주시면 고치겠습니다.

 

참고

 

핸드셰이킹과 관련한 어마어마 자세한 링크 2. 이것보다 세세하게 설명할 수는 없겠다.

- https://tls.ulfheim.net/

- https://tls13.ulfheim.net/

 

X509 v3 정보: https://www.lesstif.com/pages/viewpage.action?pageId=7635159

 

 

클라이언트가 서버에 접근하기도 전에 이루어지는 것들

 

1) CA 서버 - 서버의 인증서 받기

 

CA Certificate Authority 약자이며 인증서를 만들어주는 인증기관이다.

이런 CA (trusted Root CA) 필요한 이유는 무얼까?

만약 가짜 국민은행 사이트가 가짜 인증서, 혹은 가짜 공개키를 주며 자신이 국민은행이라고 우기더라도, CA 통해 진위를 알아낼 있는 것이다.

 

1) 서버는 공개키와 개인키 생성한 다음, 인증기관에게 서버 정보 + 공개키 제출

2) 인증기관은 검증 완료후 제출 받은 서버 정보 + 공개키 인증기관의 개인키 암호화(= 서버 인증서)

3) 인증기관은 사이트에게 서버 인증서

서버 인증서를 복호화 하려면  인증기관의 공개키 필요하다.

- 인증기관의 공개키로 복호화가 된다는 것은, 인증기관이 서버를 면밀히 검토했고, 보증한다는 것이다.

- 따라서, 서버 인증서를 복호화 하면 인증기관이 보증하는 서버의 정보와 서버의 공개키를 가지게 된다.

 

2) CA 클라이언트 ( 브라우저) - 웹브라우저는 어떻게 CA 공개키를 가지는가

 

인증기관은 사용자가 쓰는 웹브라우저에 인증기관의 공개키 제공한다.

우리가 크롬, 파이어폭스, 익스플로러를 설치하면, 애초에 검증된 인증기관의 공개키 가지고 있는 것이다.

- 좀더 심화해서 보려면 아래 링크를 통해 인증서 체인을 알아보자

- https://ibm.co/2XDEozs

- https://support.dnsimple.com/articles/what-is-ssl-certificate-chain/


간략히 설명해본다.

1) 서버는 Intermediate CA 로부터 인증서를 받는데

2)  Intermediate CA 대한 공개키는 브라우저에 없을 있다.

3)  Intermediate CA

- 인증서를 요청한 서버에게 자신이 발급해주는 인증서와 함께

- Root CA   Intermediate CA 인증해주는 인증서를 보내주는 것이다. 물론 이건 여러 개의  Intermediate CA 거쳐서 Root CA 까지 올라갈 있다. (Chain)

-  Intermediate CA Root CA 의해서 공인된 기관이고,  Intermediate CA 해당 서버를 인증해준다는 것이다. 


클라이언트가 서버에 접근하며 이루어지는 핸드셰이킹

 

서버와 클라이언트가 가지고 있는 것들

 

현시점, 서버와 클라이언트가 가지고 있는 것들 부터 생각해보자.

 

클라이언트 (브라우저)

서버

인증기관의 공개키 (브라우저에 기본내장)

서버의 개인키

인증기관이 보증하는 서버 인증서

- 서버의 정보 서버의 공개키 암호화되어 담겨있다.

 

 

서버와 클라이언트의 핸드셰이킹

 

서로 데이터를 주고받으면서 암호화된 세션을 만드는 과정이다.

쉽게 표현하면 서버와 클라이언트가 공유할 있는 대칭 알고리즘의 비밀키를 안전하게 나눠 가지는 것이다.

 

아래 링크는 매우 디테일한 핸드셰이킹 과정이다.

- https://tls.ulfheim.net/

- https://tls13.ulfheim.net/

 

간략하게 과정을 정리해보자

 

1) 클라이언트 (웹브라우저) 사이트에 접속

2) 서버는 인증기관에게서 받은 서버 인증서 보냄

3) 클라이언트는 인증기관이 웹브라우저에 넣어둔 인증기관의 공개키 사이트 인증서 푼다.

- 클라이언트는 인터넷 사이트의 서버 정보 + 공개키 가지게 된다.

4) 클라이언트는 대칭 알고리즘 비밀키 서버의 공개키 암호화 하여 사이트로 전송한다.

- 과정은 엄밀하게는 맞지 않지만 개념만 이해하자

5) 사이트는 암호화된 패킷을 서버의 개인키 풀어서 대칭 알고리즘 비밀키 알아낸다.

6) 서버와 클라이언트는 둘만의 대칭 알고리즘 비밀키 가지게 된다.

 

이제 이걸로 암호화해서 전송하면 받는 쪽에서 복호화해서 있는 것이다.

 

인증서 포맷 x.509 v3

 

위키 링크: https://www.wikiwand.com/en/X.509

 

별거 아니다.

인증기관 (CA) 만들어주는 인증서의 포맷이다.

 

구글의 인증서를  받아보았다.

1) 크롬으로 www.google.com 으로 접속한 다음에 주소창 왼쪽의 자물쇠 아이콘을 클릭하면 인증서를 있다.\

2) 이렇게 있는 , 크롬 브라우저가 이미 가지고 있던 인증기관 공개키로 인증서를 Verify 했다는 것을 의미한다.

 

 구글 인증서

 

 

- 버전 정보는 X.509 버전이 V3 이라는

- 시리얼 넘버는 인증기관이 발급한 인증서에 붙이는 번호

- 서명에 쓰인 알고리즘

- 인증서 내용을 SHA256 으로 해싱하고

- 해시값을 RSA 이용해 인증기관 개인키로 암호화했다는

- 발급한 인증기관 이름

- 유효기간의 시작과 : 구글 인증서를 보면 대략 3개월이 안된다.

- 주체 (Subject), 서버의 이름이다.

- 그리고 드디어 중요한 주체의 공개키 정보

- 공캐키

- 공개키 알고리즘:  ECDSA_P256 (비대칭키 알고리즘)

- (중략)

- 인증서의 서명

- 원본 메시지와 서명이 있으니

- 브라우저가 기본으로 가지고 있는 CA 공개키를 가지고

- 원본 메시지가 정말 CA 인증기관이 발급한 건지 verify 가능하다.

 

 

 

와이어 샤크로 보기

 

링크를 따라해 보았다.

YouTube 링크: https://youtu.be/u4ht-E-Kihk

 

1) 파이어폭스 브라우저를 열고 설정에서 쿠키와 데이터를 깨끗이 지워줌

 

 

2) 와이어샤크를 실행하고, 파이어폭스 브라우저로 www.naver.com 접속. 그리고 로그인을 다음에 와이어 샤크를 멈춘다.

3) filter ssl 이라고 쳐서 관련한 패킷들만 남김

4) 그리고 Client Hello 라는 메시지를 찾아서 우클릭 Follow >> TLS Stream 해준다.

 

 

5) 팝업창이 나오는데 그걸 닫으면 우리가 선택한 패킷과 같은 stream 필터링해주게 되며 여기에 && ssl 적용해주면 좀더 정리할 있다.


 

이제 하나씩 챙겨보자.

 

패킷 121

 

클라이언트가 서버 (네이버)에게 먼저 말을 거는거다.

 

1) 임시 마스터 비밀키를 만들기 위한 랜덤값을 보내고

2) 클라이언트가 다룰 있는 암호들의 리스트를 보낸다. 서버보고 뭘로 할지 고르라는 것이다.

- 예를 들면 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 라면 대충 RSA 비대칭키, AES128 대칭키, SHA256 해시 알고리즘을 있다는

 


 

패킷 130

 

이번엔 서버가 회신을 했다.

 

1) 먼저 역시나 서버측의 랜덤 값을 보내고 (서버와 클라이언트는 각각 자신들의 랜덤값을 주고 받았다)

2) 서버는 클라이언트가 지원하는 암호들 중에서 하나를 골랐다. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

 


 

 

3) 인증서도 있다. 일부만 살펴보아도 위에서 언급한 X.509 V3 포맷이 보인다.

 

- version: v3 이고

- signature 있으며

- validity   유효기간이 명시되어 있다.

 


 

 

4) 하나만 보면 교환 방식이 나와있다.

 

- 디퍼헬만 방식으로 하겠다는 것이다.

 

 

패킷 132

 

클라이언트는 CA 공개키로 인증서를 Verify 하였을 것이다.

 


 

 

패킷 134

 

드디어 서버가 클라이언트에게 새로운 세션 티켓을 주었다.

이후의 패킷은 안전하게 암호화가 되어 주고 받게 된다.

 

 

반응형

'golang' 카테고리의 다른 글

Slack Slash Command - 영한 번역(1)  (0) 2019.07.12
gRPC SSL/TLS 3. 실제 구현  (9) 2019.07.01
gRPC SSL/TLS 1. 암호에 대하여 - 대칭키, 비대칭키, 해시 알고리즘  (0) 2019.07.01
gRPC Error in Golang  (0) 2019.06.27
gRPC Deadline  (0) 2019.06.26
반응형
잡학툰 뱃지
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함