[SSL/TLS] 인증서가 보장해주는 신뢰는 어디까지인가

[SSL/TLS] 인증서가 보장해주는 신뢰는 어디까지인가
Photo by Jaye Haych / Unsplash

[요약]

  1. 인증서를 발급받은 서버는 Chain of trust를 통해 Root CA의 신뢰를 상속받을 수 있다. 그러나 인증서 종류에 따라 해당 서버를 신뢰할 수 있는 범위는 제한이 된다.
  2. Self signed certificate는 자신이 CA가 되는 것이기 때문에 상속 받을 신뢰가 없다는 문제점이 있다. Self signed certificate는 클라이언트와 서버가 서로 알고 있을 때 괜찮은 방법일 수 있다. 그러나 제3자에게 자신의 서버를 오픈하고 싶을 때는 문제가 될 수 있다. 비용을 아끼려면 Let's Encrypt와 같은 비영리 CA를 이용하자.

이 글에서는 TLS의 자세한 동작 원리 설명은 생략합니다.


목차

0) Prerequisite: CA, Man-in-the-middle attack, Chain of Trust

1) 신뢰할 수 있다는 것은 무슨 의미인가?

2) Self signed certificate는 어떤 의미가 있는 것인가?


0) Prerequisite

CA(Certificate Authority)

CA는 디지털 인증서를 발급해주는 주체들을 말한다. 디지털 인증서는 타겟 서버가 아닌데도 타겟 서버처럼 행동하는 악의적인 주체들을 방지하는데 꼭 필요하다. 즉, man-in-the-middle attack과 같은 시나리오를 막을 수 있다.

브라우저와 같은 클라이언트 소프트웨어는 신뢰할 수 있는 CA 인증서 목록들을 가지고 있다. 브라우저는 신뢰할 수 있는 CA 인증서가 아니면 접속을 제한하거나 경고를 하는 등 유저한테 이를 알려준다. 서버 관리자들은 CA에게 돈을 지불하고 인증서를 발급받고, 해당 서버로 접속하는 클라이언트는 믿고 안전하게 커넥션을 맺는 방식이다.

22.12.17 기준 Mozilla가 개발한 Firefox는 148개의 CA가 존재하고, WindowMacOS 는 링크에서 확인할 수 있다.

신뢰할 수 있는 인증서를 발급하는 회사의 점유율은 소수에게 집중이 되어 있다. 22년 7월 기준 IdenTrust가 48.9%, DigiCert가 18.7%, Sectigo가 15.5%를 차지한다.

Man-in-the-middle attack

두 주체가 통신을 할 때 공격자가 그 사이에 껴서 서로의 통신을 위조해서 전달하는 공격을 말한다.

https://en.wikipedia.org/wiki/Man-in-the-middle_attack

Alice와 Bob이 통신을 하고 있고, Mallory가 패킷을 가로채 위조하는 시나리오를 생각해보자.

  1. Alice는 Bob에게 Bob의 공개 키를 물어본다.
  2. Bob은 Alice에게 자신의 공개 키를 전달하지만 Mallory는 가로채고 자신의 공개키를 전달한다.
  3. Alice는 Mallory의 공개 키를 Bob의 공개 키로 생각하게 된다. Alice는 자신의 메시지를 Mallory의 공개 키로 암호화해서 Bob에게 전송한다.
  4. Mallory는 Alice의 메시지를 가로채고 자신의 비밀 키로 복호화해 정보를 알아낸다. 그리고 아까 가로챘던 Bob의 공개 키로 다시 암호화해 Bob에게 전달한다.

이런 식으로 Mallory는 Alice와 Bob의 메시지를 전부 볼 수 있을 뿐만 아니라 위조할 수 있게 된다.

SSL을 사용하면 중간 공격자가 패킷을 위조할 수 없게 되어 Bob의 공개 키가 안전하게 Alice에게 도달할 수 있게 된다. 즉, Man-in-the-middle attack을 효과적으로 막을 수 있게 된다.

Chain of trust

https://en.wikipedia.org/wiki/Chain_of_trust

사용자가 웹사이트에 방문했을 때 사용자는 디지털 인증서를 받게 된다. 브라우저는 해당 인증서를 발급해준 주체가 신뢰할 수 있는 CA (Root CA)인지 확인하게 된다.

Intermediate CA는 Root CA가 인증서를 발급해줄 수 있는 권한을 위임해준 주체다. PKI의 필요성이 증가하면서 더 많은 Root CA가 필요했지만 그만큼 Root CA를 증가시키는 것은 관리 이슈가 증가할 수 있기에 Intermediate CA를 둔 것이다.

Root CA가 개인 키로 intermediate root를 사인하면 Intermediate 인증서는 신뢰할 수 있게 된다. Intermediate 인증서의 키를 이용해서 다시 사인을 하게 되면 End-Entity의 인증서 또한 신뢰할 수 있게 되는 것이다.

보통 Root CA의 인증서는 2년부터 25년까지 유효하지만 intermediate 인증서는 2년 이하이다.

1) 신뢰할 수 있다는 것은 무슨 의미인가?

위 CA와 Chain of Trust를 설명을 간략히 하면서 신뢰라는 이야기를 계속해서 말을 했다. 그런데 여기서 신뢰라는 것은 정확히 무엇을 말하는 것일까?

즉, Chain of Trust를 통해서 사이트가 SSL을 사용하면 신뢰할 수 있는 사이트라는 것인데 이는 무엇을 의미하는 것일까?

먼저 서버가 자신의 인증서를 CA에게 인증받기 위해 하는 절차를 알아보자.

CA들이 인증서들을 HTTPS 서버들에게 발급할 때 domain validation을 사용해 해당 서버들을 검증해준다. CA간 사용하는 domain validation은 다르지만, 보통 주어진 domain 이름에 대해 제어를 할 수 있는지 확인한다.

Digicert가 제공하는 domain validation을 예로 들어보자.

Digicert에서는 보통 이메일 유효성 검사를 많이 한다. 도메인의 WHOIS 레코드에 있는 이메일이나 도메인에 대해 지정된 이메일 주소 혹은 DNS TXT의 연락처에 에 인증 메일을 보낸다. 즉, DNS에 사이트의 도메인을 등록한 사람이 맞는지를 확인하는 작업만 수행하는 것이다. 달리 말하면 도메인의 주인이 관리하는 이메일에 접근할 수 있는지 확인하는 작업이다. 그래서 사이트를 등록한 사람에 대한 Identity는 전혀 검증하지 않는다(Extended Validation SSL 인증서를 사용하면 owner도 검증한다. 하지만 소규모의 웹사이트들은 굳이 사용할 이유가 없다).

정리하면, CA는 웹사이트의 domain valdation을 진행하고 이는 DNS에 사이트를 등록한 사람과 CA에 SSL 인증서를 요청한 사람이 같은지 확인하는 작업이다.

Domain validation으로 방지할 수 있는 사기는 아주 기초적인 수준이다. 자신의 도메인이 아닌 도메인을 자신의 도메인이라고 주장하는 것을 막을 수 있다.

하지만 해당 사이트가 적절한지 검증하는 절차는 전혀 없기에 SSL이 발급되었다고 해서 해당 사이트가 믿음직스럽다고 판단할 수는 없다.

이러한 한계 때문에 인증서는 아래와 같이 3개의 인증서로 나뉜다. 회사 소유의 홈페이지는 OV나 EV 인증서를 많이 사용한다. 이 두 인증서는 company validation을 하기 때문에 owner 인증을 하지 않는 DV 인증서보다 더 믿을 수 있다.

https://www.internetx.com/en/news-detailview/what-is-the-difference-between-dv-ov-and-ev-certificates/

2) Self signed certificate는 어떤 의미가 있는 것인가?

개인 사이트를 만들고 SSL을 적용하려고 하면 가장 많이 나오는 방법이 OpenSSL을 사용하는 방법이다. OpenSSL의 여러 기능 중에서도 Self signed certificate를 생성하는 방법이 많이 검색이 된다. SSL 인증서를 발급받으려면 비용이 발생하기 때문에 OpenSSL을 사용해 자신이 인증 기관을 만들어 Self signed certificate를 생성하는 것이다.

이 방법을 사용하면 당연하게도 브라우저가 해당 사이트에 접근할 때 경고를 띄우게 된다. 브라우저에는 해당 인증기관을 모르기 때문이다. 그래서 인증서를 받아도 브라우저가 경고를 띄우게 된다.

This is probably not the site you are looking for!
The site's security certificate is not trusted!

만약 해당 사이트를 사용하는 클라이언트가 제한적이라면, 해당 클라이언트의 브라우저 등에 생성한 CA를 미리 등록을 해놓는다면 아무 문제가 없다. 하지만 제3자가 자신의 사이트를 사용하게 하고 싶다면 이는 적절한 방법이 아니다. 제3자는 당연히 당신이 신뢰할 수 있는 인증기관인지 판단할 수 없기 때문이다. 그래서 나는 스스로 인증기관을 만들어 SSL을 적용하는 것은 제한적이라고 생각한다.

지금 이 Ghost 블로그는 Let's Encrypt를 사용하여 SSL을 적용하고 있다. Let's Encrypt는 nonprofit CA이다. ISRG에 의해 제공되는 서비스이며 공익을 위해 무료로 디지털 인증서를 제공한다.

pangyoalto.com의 인증서 계층

이렇게 무료로 디지털 인증서를 제공하는 조직이 있으니 Self signed certificate를 만드는 것보다 CA를 인증서에 등록하는 것이 더 좋다고 생각한다. 다만 Let's Encrypt를 사용하면 Domain Validation 만 제공을 하기 때문에 자신의 인증서를 OV나 EV로 사용하고 싶다면 유료로 CA에게 인증서를 발급받아야 할 것이다.