나는 다른 스택 답변(이와 관련된 수많은 답변이 있음)의 지침에 따라 openssl verify
다음과 같이 Let's Encrypt 인증서를 확인하는 명령을 작성했습니다.
openssl verify -show_chain /etc/letsencrypt/live/mail.example.com/chain.pem /etc/letsencrypt/live/mail.example.com/cert.pem
하지만 오류로 인해 실패합니다.
CN = mail.example.com
error 20 at 0 depth lookup: unable to get local issuer certificate
error /etc/letsencrypt/live/mail.example.com/cert.pem: verification failed
/etc/letsencrypt/live/mail.example.com/chain.pem: OK
Chain:
depth=0: C = US, O = Let's Encrypt, CN = R3 (untrusted)
depth=1: C = US, O = Internet Security Research Group, CN = ISRG Root X1
교체해도 fullchain.pem
여전히 chain.pem
실패합니다. 하지만 이것들은 모두 Let's Encrypt가 나에게 배포한 인증서입니다!
내가 여기서 무엇을 놓치고 있는 걸까요?
답변1
openssl verify -show_chain /etc/letsencrypt/live/mail.example.com/chain.pem /etc/letsencrypt/live/mail.example.com/cert.pem
이 명령은 잘못되었습니다. 주어진 모든 인증서를 서로 독립적으로 확인하려고 시도합니다. 즉, 신뢰 체인을 구축하지 않고 첫 번째 인증서를 확인합니다. 대신 명령은 다음과 같아야 합니다.
openssl verify -untrusted chain.pem cert.pem
-untrusted
중간 인증서를 발급합니다 . 루트 인증서 ISRG X1은 최신 시스템의 신뢰 저장소에서 얻습니다. 그렇지 않으면 이를 사용하거나 -trusted
제공 해야 합니다 -CAfile
.
답변2
업데이트된 답변:
@SteffenUllich의 답변을 정답으로 표시하고 있지만 번들 내부 내용 및 그가 답변에서 참조하는 신뢰 저장소와 관련된 부분만 확장하겠습니다.
Files Let Us Encrypt는 다음을 제공합니다.
실수등장내 신뢰 체인이 손상되어 누락되었음을 나타냅니다.적어도인증서. 하지만 내가 어떤 자격증을 갖고 있는지 알기 전까지는 내가 무엇을 놓치고 있는지 전혀 알 수 없었습니다.
그래서 Let's Encrypt가 제공한 경로의 파일을 살펴본 결과 /etc/letsencrypt/live/example.com/
번들에 다음이 포함되어 있음을 발견했습니다.
인증서.pem: 서버의 인증서
체인.pem: 암호화하자"R3"인증서+"ISRG 루트X1” (“중간 인증서”)
풀체인.pem: "Chain.pem" + "Certificate.pem"
개인키.pem: 개인 키입니다. 공개 키는 다음과 같이 인코딩됩니다.cert.pem
노트:한 줄의 코드를 사용하여 위 내용을 확인하세요., mail.example.com
경로를 자신의 인증서 이름으로 바꿉니다.
while openssl x509 -noout -text; do :; done < /etc/letsencrypt/live/mail.example.com/cert.pem
while openssl x509 -noout -text; do :; done < /etc/letsencrypt/live/mail.example.com/chain.pem
while openssl x509 -noout -text; do :; done < /etc/letsencrypt/live/mail.example.com/fullchain.pem
신탁 상점:
서버 인증서를 확인하려는 초기 시도에 체인을 원본으로 다시 추적할 수 있는 "신뢰 앵커"가 누락된 것 같습니다.
하지만: -CAfile
지정하지 않으면 Steffen이 말했듯 openssl
이 "신뢰 저장소"를 구문 분석하여 루트 인증서를 찾아 신뢰 체인을 완성합니다.
"Trust Store"를 설치하려면 배포판에서 "ca-certificates"/"ca-certificates-bundle" 패키지를 검색하세요.
따라서 CA 인증서가 이미 존재하므로 원래 답변에서 잘못 언급했듯이 체인을 성공적으로 추적하기 위해 다른 것을 다운로드할 필요가 없습니다. 실제로 openssl
일치하는 항목을 찾을 때까지 신뢰 저장소의 모든 항목을 구문 분석하면 유효성 검사가 성공할 가능성이 더 높습니다.
신뢰할 수 있는 매장의 위치를 찾으려면:
openssl version -d
알파인 리눅스에서는 다음과 같습니다./etc/ssl
결론적으로:
내가 내린 명령이 잘못된 이유로 성공했음을 상기시켜준 Steffen에게 감사드립니다 ;-). 공평하게 말하면 openssl
문서가 조금 더 나아질 수 있습니다 ...