요약
- openssl verify 는 Root CA 정보가 포함된 Chain에 대해서 검증합니다.
- Let's Encrypt 는 Root CA 정보가 누락된 Chain이 발급되므로, Root CA를 따로 넣어줘야 합니다.
- Root CA 다운로드
- PEM 형식 변환
- Root CA 포함된 Chain 생성
- Chain 검증
보유한 도메인에 무료로 인증서를 붙일 수 있는 Let's Encrypt를 개발하시는 분들은 많이 사용하실 것으로 생각됩니다.
오늘은 Let's Encrypt 의 Chain verify 관련해서 포스팅을 해보겠습니다.
Let's Encrypt는 certbot을 통해 인증서를 신규 발급하고, 갱신할 수 있습니다.
certbot의 사용법은 공식 홈페이지를 통해 확인할 수 있으며, 신규 발급과 설정은 다른 포스팅으로 찾아 뵙겠습니다. : )
우선, certbot을 사용하여 신규 / 갱신 작업을 완료할 경우, 총 4개의 파일이 생성됩니다.
- cert.pem
- chain.pem
- fullchain.pem
- privkey.pem
아래의 커맨드를 통해 subject와 issuer를 확인할 수 있습니다.
$ openssl x509 -noout -in chain.pem -subject -issuer
subject= /C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
issuer= /O=Digital Signature Trust Co./CN=DST Root CA X3
인증서 Chain 관계를 파악하기 위해선 아래와 같은 커멘드를 사용하여 확인할 수 있습니다.
$ openssl verify -CAfile chain.pem cert.pem
cert.pem: OK
다만, Let's Encrypt 의 경우 아래와 같이 에러가 발생하는데, 이는 Intermediate CA 정보만 입력된 Chain이 발급되기 때문입니다.
cert.pem: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
error 2 at 1 depth lookup:unable to get issuer certificate
이를 해결하는 방법은 2가지가 존재합니다.
- -untrusted 인자 전달
- Root CA 추가
1번 방법의 경우, 임시적으로 -untrusted 인자를 넣어 검증하는 방법입니다.
$ openssl verify -untrusted chain.pem cert.pem
cert.pem: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
error 2 at 1 depth lookup:unable to get issuer certificate
OK
이는 임시방편이며, 실제 검증 기능을 서비스에 추가할 경우에는 2번 Root CA 추가하는 방법을 권합니다.
2번 방법의 경우, Let's Encrypt 가 사용하는 Root CA를 찾아 완벽한 Chain 관계를 만들어 주면 됩니다.
Let's Encrypt 는 DST Root CA X3 를 Root CA로 사용합니다.
우선, 1) Root CA를 다운로드 하고
wget http://apps.identrust.com/roots/dstrootcax3.p7c
2) PEM 형식으로 변환을 합니다.
$ openssl pkcs7 -inform der -in dstrootcax3.p7c -out dstrootcax3.pem -print_certs
그리고 3) Root CA가 포함된 Chain을 생성하고,
$ cp fullchain.pem fullca.pem
$ cat dstrootcax3.pem >> fullca.pem
4) Chain verification을 진행합니다.
openssl verify -CAfile fullca.pem cert.pem
cert.pem: OK
진행하시다가 궁금하신 사항은 편하게 댓글 남겨주세요 :)
확인 후 답변 드리겠습니다.
댓글