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개의 파일이 생성되어있다. 각 파일의 의미는 아래와 같다.
- cert.pem : yourdomain.com 의 인증서 (public key)
- chain.pem : Let’s encrypt의 Intermediate 인증서.
- fullchain.pem : cert.pem 과 chain.pem을 합친 결과
- 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.pem
는 chain.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