이번 글에서는 디지털 인증서와 SSL/TLS 기초에 대해 알아보겠습니다.
인증서(Certificate)
인증서(Certificate)는 자신이 인증된 존재라는 것을 증명하기 위한 장치입니다.
서버의 존재 증명을 위해 사용하거나 암호화 통신을 위한 기초 정보로 사용합니다.
인증서에는 인증서의 발행자, 발행을 받은 사람, 유효기한의 정보가 담겨 있습니다.
브라우저 상단에 자물쇠 모양을 클릭해 쉽게 확인해 볼 수 있습니다.
인증서는 CA라고 불리는 인증기관(Certificate Authority)이 발행합니다.
인증기관은 PKI(Public Key Infrastructure, 공개키 기반 구조) 정책을 이용하고
국가가 운용하는 경우 GPKI(GovernmentPKI)라고 부르는 경우가 있습니다.
- PKI는 디지털 인증의 생성, 관리, 배포, 사용, 저장, 파기와 공개키 암호화의 관리에 쓰이는
일련의 역할, 정책, 하드웨어, 소프트웨어, 절차의 총칭을 말합니다.
인증기관은 크게 루트 인증기관(Root CA)과 중간 인증기관으로 나누어집니다.
루트인증기관
인증기관의 최상위 인증기관으로 루트인증기관의 정당성은 자기 스스로 보증합니다.
스스로 루트 인증서를 발행하고 보통 루트 인증서는 OS나 브라우저와 함께 배포됩니다.
중간인증기관
루트 인증기관으로부터 위임을 받은 인증기관입니다. 루트 인증기관의 신뢰를 받음으로써 자신을 보증합니다.
중간 인증서는 보통 서버, 클라이언트 모델에서 서버를 운용하는 측이 서버 인증서와 함께 서버에 저장하여 사용합니다.
또한 중간 인증기관이 발행한 서버 인증서와 같은 인증서가 올바른지를 확인하는 근거가 되는 인증서이며
중간 인증서 자체는 상위 인증기관이 발행합니다.
인증서 발행 과정
1. 루트 인증기관이 스스로를 보증하는 루트 인증서를 발행합니다.
- 루트 인증서에는 루트 인증기관의 공개키가 포함되어 있으며 보통 OS나 브라우저와 함께 배포됩니다.
2. 중간 인증기관은 루트 인증기관 또는 상위 인증기관에 CSR(Certificate Signing Request)을 보냅니다.
- CSR에는 중간인증기관의 인증정보와 생성한 공개키를 첨부해 보냅니다.
- 루트 인증기관이 CSR을 확인하고 검증된 경우 루트 인증기관의 비밀키로 서명된 중간 인증서를 발행합니다.
- 중간 인증서에는 중간 인증기관의 공개키가 포함되어 있습니다.
인증서 검증 과정
1. 클라이언트가 웹 서버에 인증서의 제시를 요구합니다.
2. 웹 서버는 서버에 저장된 중간 인증서와 서버 인증서를 클라이언트에게 응답으로 보냅니다.
3. 클라이언트는 웹 서버가 전달한 중간 인증서에서 중간 인증기관의 공개키를 추출합니다.
4. 추출한 중간 인증기관의 공개키를 이용해 서버 인증서를 검증합니다.
5. 서버 인증서의 유효성이 검증되면 루트 인증서에서 루트 인증기관의 공개키를 추출합니다.
6. 루트 인증서의 공개키를 이용해 중간 인증서를 검증합니다.
7. 중간 인증서의 유효성이 검증되는 것으로 마무리됩니다.
SSL/TLS
SSL/TLS는 인터넷 통신을 위한 인증 및 통신 암호화 장치입니다.
SSL(Secure Socket Layer)
SSL은 넷스케이프사에서 만든 인터넷 통신 암호화 장치입니다.
버전 1,2,3이 개발되었으나 보안상 취약성이 발견되어 더 이상 사용되지 않고 있습니다.
더이상 사용되지 않지만 SSL/TLS를 SSL이라고 그냥 표현하는 경우가 많습니다.
TLS(Transport Layer Security)
TLS는 SSL 이후 SSL의 취약성을 보완하여 등장한 인터넷 통신 암호화 장치입니다.
SSL과는 다르게 TLS 핸드세이크라는 과정을 통하여 서로 인증서를 검증하는 단계를 포함하고 있습니다.
핸드세이크 과정은 크게 세 단계로 이루어집니다.
1. 서로가 어떤 TLS 버전을 사용 가능한지 확인
2. 인증서를 사용해 서로 신뢰할 수 있는지 확인
3. 서로 간의 통신에 사용할 암호교환
TLS 핸드세이크
1. 클라이언트가 서버 측에 클라이언트 헬로 요청을 보냅니다.
- 해당 요청에는 클라이언트가 지원하는 TLS 버전, 암호 방식, 클라이언트가 생성한 무작위 바이트 문자열을 포함합니다.
2. 서버가 클라이언트에 서버 헬로로 응답합니다.
- 해당 응답에는 클라이언트가 지원하는 암호 방식 중 서버가 선택한 암호 방식, 서버 인증서, 서버가 생성한 무작위
바이트 문자열을 포함해 응답합니다.
3. 클라이언트가 서버가 제시한 인증서를 검증합니다.
4. 인증서의 유효성이 검증되면 클라이언트가 서버에 예비 마스터 암호를 생성해 전달합니다.
- 예비 마스터 암호는 클라이언트가 새로 생성한 무작위 바이트 문자열을 서버가 보낸 인증서에서 공개키를 추출해, 해당 공개키로 암호화한 암호입니다.
5. 서버 측에서 예비 마스터 암호를 개인키로 복호화합니다.
6. 세션키를 생성합니다.
- 클라이언트가 보낸 무작위 바이트 문자열, 서버가 보낸 무작위 바이트 문자열, 예비 마스터 암호 세 가지를 이용합니다.
- 서버가 선택한 암호 방식과 세 가지 무작위 바이트 문자열을 가지고 세션키를 생성합니다.
7. 세션키로 암호화된 완료 메세지를 주고받습니다.
8. 세션키 검증이 완료되면 암호화 통신을 시작합니다.
참조
[보안의 기본] Miyamoto Kunio, Okubo Takao 지음, 이영란 옮김, 위즈플래닛
SSL 취약점
v2 DROWN(Decrypting RSA with Obsolete and Weakened eNcryption)