Let’s encrypt로 만든 인증서 살펴보기

Key Kim
7 min readOct 17, 2021

--

Let’s encrypt를 이용하여 SSL 인증서를 만들 때 생성되는 파일들을 확인해보고, 어떤 역할을 하는지 정리해보고자 한다.

Let’s Encrypt?

무료로 SSL 인증서를 생성할 수 있는 서비스이다.

Nginx, Apache등과 같은 웹서버와 각종 미들웨어, 소프트웨어에 쉽게 SSL을 적용할 수 있게 도와준다.

인증서 만들기

Let’s encrypt로 인증서를 생성하면 어떤 결과물이 나오는지 확인해보자.

아래 명령어를 이용해서 인증서를 생성한다.

docker run -it --rm --name certbot \
-v '/etc/letsencrypt:/etc/letsencrypt' \
-v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
certbot/certbot certonly -d '*.yourdomain.com' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

생성된 인증서 결과물

인증서가 생성된 폴더로 이동해보자

cd /etc/letsencrypt/live/<yourdomain.com>tree.
├── cert.pem -> ../../archive/<yourdomain.com>/cert1.pem
├── chain.pem -> ../../archive/<yourdomain.com>/chain1.pem
├── fullchain.pem -> ../../archive/<yourdomain.com>/fullchain1.pem
└── privkey.pem -> ....

총 4개의 파일이 생성되어있다. 각 파일의 의미는 아래와 같다.

  1. cert.pem : yourdomain.com 의 인증서 (public key)
  2. chain.pem : Let’s encrypt의 Intermediate 인증서.
  3. fullchain.pem : cert.pem 과 chain.pem을 합친 결과
  4. privkey.pem : cert.pem publickey에 대응하는 비밀키

아래 그림은 인증서의 동작 방식을 잘 설명한 내용이다.

우리가 방금 만든 인증서도 위 그림과 다르지 않다.

Let’s encrypt로 만든 인증서인 cert.pem을 확인해보자.

openssl x509 -in cert.pem -text
...
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
<your certificate serial number >
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, O = Let's Encrypt, CN = R3
...

인증서의 정보들이 담겨있다.

cert.pem의 발행자를 살펴보자.

openssl x509 -in cert.pem -noout -issuer
>>> issuer=C = US, O = Let’s Encrypt, CN = R3

cert.pem의 발행자는 R3로, 중간인증서에 해당한다.

r3인증서를 실제로 다운로드 받아서 검증해보자.

wget https://letsencrypt.org/certs/lets-encrypt-r3.pem
openssl verify -CAfile lets-encrypt-r3.pem cert.pem
>>> cert.pem: OK

참고로 lets-encrypt-r3.pemchain.pem 에도 존재한다.

이번엔 cert.pem에 있는 public key와 privkey.pem가 서로 페어인지 검증해보자.

RSA 암호를 만들 때 사용한 modulus(N) 값은 private key, public key 두 개에서 모두 찾아낼 수 있다. 이를 이용하여 키를 검증한다.

openssl x509 -noout -modulus -in cert.pem | openssl md5
>>> aaaa..
openssl rsa -noout -modulus -in privkey.pem | openssl md5
>>> aaaa..

명령어를 실행시켜보면 modulus 값에 대한 md5 hash를 볼 수 있다.

만약 두 개의 명령어의 결과가 같다면 같은 modulus를 가진다는 의미고, public key, private key는 페어임을 말해준다.

이번엔 chain.pem을 살펴보자.

chain.pem은 Intermediate 인증서, R3가 있는 파일이다.

openssl x509 -in chain.pem -noout -issuer
>>> issuer=C = US, O = Internet Security Research Group, CN = ISRG Root X1

R3 인증서를 발행한 ISRG Root X1 이 issuer로 뜨는걸 확인할 수 있다.

아래 명령어로 확인해보자.

wget https://letsencrypt.org/certs/isrgrootx1.pemopenssl verify -CAfile isrgrootx1.pem chain.pem
>>> chain.pem: OK

마지막으로 fullchain.pem은 별 다른게 없다.

cert.pem과 chain.pem을 단순히 합친 파일일 뿐이다.

# fullchain.pem 만드는 법
cat cert.pem >> chain.pem ==> fullchain.pem

Reference

--

--

No responses yet