개발/기타

[SSL] SSL 인증서 구조, ROOT, ICA 인증서

Hide 2025. 4. 30. 00:26

SSL 인증서는 HTTPS 통신을 통해 웹 사이트 브라우저 전송 시 주고받는 데이터를 암호화한다. SSL 인증서를 통해 클라이언트와 서버 간 통신을 보안화하고 통신 과정에서 발생할 수 있는 스니핑, 피싱, 데이터 변조 등의 해킹을 방지할 수 있다. SSL은 대칭키 암호화 방식과 공개키 암호화 방식을 사용한다.

 

SSL 인증서는 CA(Cirtificate Authority, 인증기관) 읹으서 발급 회사에서 시작하는 ROOT 인증서에서 시작한다.

일반적으로 인증서는 ROOT, Intermediate(중간 인증서), Leaf(서버 인증서) 3단계로 구성되어 있고 이를 인증서 체인(certificate chain) 이라고 한다.

사용자가 구입하는 SSL 인증서는 Leaf 인증서를 의미하며 이는 인증서 체인의 일부이지 전체가 아니다.

3개의 인증서 체인은 하위 구조의 인증서를 서명하고 상위 구조의 인증서를 참고하는 방식으로 만들어진다.

 

즉 인증서 체인은 ssl 인증서(서버인증서) 에서 시작하여 ROOT 인증서로 끝나는 목록으로 구성된다.

 

루트CA 인증서는 CA에서 자체 서명한 self-signed 인증서로 공개키 기반 암호화를 사용한다. 모든 유효한 SSL 인증서는 CA가 발행한 루트CA 인증서 아래 체인에 위치한다.

 

중간 인증서는 루트 인증서와 SSL 인증서 사이에 구분을 만들어 위험을 완화하도록 설계된 인증서이다. 루트 인증서가 가장 많은 권한을 갖고 보호되어아 하기 떄문에 루트 인증서가 손상될 경우를 대비한다.

 웹브라우저의 인증서 정보를 보면 아래와 같다.

 

맨 위의 DigiCert Global Root G2가 ROOT인증서, Thawte TLS RSA CA G1이 중간 인증서, *.tistory.com 이 SSL 인증서이다.

*.tistory.com 도메인 전용 SSL 인증서를 사용하고 있다.

루트CA 인증서는 웹 브라우저의 특정 저장소에 포함되어 있고 일부 운영체제엔 사전 설치되어 있기 때문에 따로 다운로드 할 필요는 없다. 루트 인증서를 발급한 기고나이 운영체제가 신뢰할 수 있는 CA 목록에 없으면 인증서 자체가 신뢰할 수 있는 인증서가 아니라는 경고가 표시된다.

 

브라우저 - 설정 - 보안 메뉴에서 어떤 ROOT CA들이 브라우저에서 유효하다고 인정받고 있는지 확인 가능한다. '

 

Root CA 인증서는 인증기관 중 최상위 발급기관으로 무조건 신뢰할 수 있고, Root CA는 최상위 기관이기에 본인을 인증해줄 기관이 없어 Self-signed 스스로 서명하게 된다. 보안상 루트 인증서는 직접 사용자 사이트에 서명하지 않고 대신 중간 인증서를 통해 계층적으로 위임한다.

 

Intermediate CA(ICA) 는 Root CA 아래 위치하는 발급 기관에서 발급한 인증서로 ICA가 발급 요청 시 상위 인증기관은 전송된 서버 정보와 공개키를 합쳐 해시값 생성 후 ROOTCA의 개인키로 암호화해 ICA 서명을 생성한다. 클라이언트는 인증서 포함된 정보와 공개키를 해시값으로 변환 후 인증서의 공개키로 복호화된 인증서의 서명과 비교 후 무결성을 판단한다. 

 

개인인증서(End-Entity CA) 는 개인이 인증서를 발급받아 사용하는 인증서로 ICA를 상위기관으로 가지며 ICA의 인증 및 서명을 받아 발급된다. 브라우저에 접속하는 실제 웹사이트의 인증서로 도메인에 발급된 인증서이다. 공개키, 도메인 정보, 유효기간 등을 포함하고 있다.

 

RootCA, ICA, 개인인증서는 계층 구조로 되어 있으며, 개인인증서의 서명이 ICA의 서명을 거쳐 최상위 CA의 서명까지 보증하게 되어 이를 인증서 체인이라 한다. 

 

1. 웹사이트의 SSL 인증서를 확인하고,

2. 이 인증서를 서명한 중간 인증서를 확인

3. 중간 인증서를 서명한 루트 인증서를 확인

4. 루트 인증서가 브라우저에 신뢰 저장소에 있으면 인증이 완료된다.

 

서버 설치 시 보통 아래 구성으로 인증서 묶음 구성으로 인증서 파일을 제공한다.

domain.crt -> SSL 인증서

intermediate.crt 또는 ca_bundle.crt -> 중간 인증서

.pem 또는 .p7b로 묶어서 제공하기도 하며, 웹서버 설정에서는 보통 이 둘을 합쳐 하나의 체인 인증서로 설정해야 한다.

중간 인증서가 누락되면 브라우저가 SSL 인증서만 보고 누구의 서명인지 모르기 때문에 신뢰할 수 없고, 루트 인증서를 같이 보내면 브라우저에 이미 존재하므로 전송 시 인증서 체인 과잉 경고가 나올 수 있다.

때문에 서버는 반드시 SSL 인증서 + 중간 인증서를 함께 보내야 하며, 루트 인증서는 포함하지 않아도 된다.