(항상 잘못된 정보가 포함되어 있을수 있습니다)
(잘못된 정보가 있다면 댓글로 피드백 부탁드리겠습니다)
인터넷 브라우저를 이용해서 웹서핑을 하다보면 아래와같은 비슷한 문구를 봤을것이다.

인터넷 브라우저는 안전하지 않은 사이트를 어떻게 알까? 반대로 안전한 사이트는 또 어떻게 알까? 한번 그 이유를 알아보도록 하자.
인증서
인증서란
인증서란 클라이언트와 서버간의 통신을제 3자가 보증해주는 전자화된 디지털 문서를 말한다.
클라이언트가 서버에 접속한 직후 서버는 클라이언트에게 이 인증서를 전달한다.
클라이언트는 이 인증서 정보가 신뢰할 수 있는것인지를 검증후에 그 다음 절차를 수행한다.
바로 이전 JWT 포스팅에서 이런 말을 했다.
클라이언트는 내가 요청을 보내고 응답받는 서버가 안전한 서버인지 중간공격자가 만든 가짜 서버인지를 어떻게 알 수 있을까?
이러한 악의적인 의도를 가진 행동을 파악할수 있게 해주는것이 바로 인증서다.
발급기관
이러한 인증서를 발급 하는 민간기업들이 있는데 이러한 민간기업들을 CA(Certificate authority) 라고 부른다.
Root CA라고 최상위에 있는 CA가 있다.
Root CA가 아닌 CA는 결국 Root CA에게 인증서를 발급받아야 한다.
CA는 엄격하게 공인된 기업들만이 할 수 있다.
TLS 암호화 통신을 구현하려는 서비스는 CA를 통해서 인증서를 발급받아야한다.
인증서 내용
인증서에는 다음과 같은 정보가 포함되어 있다.
- 인증서를 발급기관 정보, 서비스를 제공하는 대상의 정보 등등 인증서와 관련있는 정보
- TLS 암호화 통신에서 사용할 서버 측 공개키 등등 TLS Handshake에 필요한 정보
- 디지털 서명, 지문 등 인증에 관련된 정보
인증서 동작 방식
서비스를 제공하는 대상이 도메인과 TLS 암호화 통신에서사용할 공개키를 제출한다.
그럼 CA는 대상의 공개키를 암호화하여 인증서에 지문으로 등록한다
앞서 등록한 지문에 CA들이 자신들이 가지고 있는 비밀키를 이용해 암호화 한다.
이 비밀키는 CA만 알고 있고 유출되지 않도록 엄중하게 보관된다.
이렇게 지문을 암호화 한것을 디지털 서명이라 한다.
TLS 암호화 통신에서 클라이언트에게 이 디지털 서명과 공개키가 담긴 인증서를 전달
브라우저나 클라이언트들이 이미 가지고있는 CA 리스트와 각 CA의 공개키를 이용해 디지털 서명을 복호화 한다.
일단 서명이 복호화 되지 않는다면 1차적으로 신뢰할수없는 인증서라는 뜻이다.
만약 복호화가 되었다면 2차 검증으로 넘어간다.
아까 지문을 CA 개인키로 암호화 한게 디지털 서명이라했다. 그럼 복호화 한것은? 지문일 것이다. 지문과 복호화한 디지털 서명이 일치하면 신뢰할수 있는 인증서라고 판단할 수 있다.
만약 중간에 인증서를 가로채서 공개키를 바꾸는 공격이 있었다 해보자 디지털 서명을 복호화한 값과 일치하지않을것이다.
또 만약 인증서 자체를 위조해서 공개키도 짝짝꿍 맞춰서 내가 이용하는 서비스의 서버인척 했다고 생각해보자 애초에 개인키는 검증된 CA기관만 알고 있기때문에 완벽한 위조가 불가능하다. 클라이언트가 가지고 있는 CA기관리스트의 공개키로 복호화를 하더라도 절대 지문과 같은값이 나올수 없다.
iOS에서 신뢰 가능한 인증서 목록
https://support.apple.com/ko-kr/105116