새 CA 인증서가 클라이언트에 푸시됨에 따라 인증서 체인을 다운로드하고 로컬에서 확인하려고 합니다. 기본적으로 어떤 웹사이트가 특정 시간에 작동하는지 파악하는 것입니다. 다음 명령을 사용하여 체인을 다운로드합니다.
echo -n | openssl s_client -showcerts -connect example.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > mycert.pem
그러나 그것을 사용할 때 openssl verify
다음과 같은 오류 메시지가 나타납니다.
root@host:~# openssl version
OpenSSL 1.1.0e 16 Feb 2017
root@host:~# echo -n | openssl s_client -showcerts -connect example.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > mycert.pem
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, CN = DigiCert SHA2 Secure Server CA
verify return:1
depth=0 C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
verify return:1
DONE
root@host:~# openssl verify mycert.pem
C = US, ST = California, L = Los Angeles, O = Internet Corporation for Assigned Names and Numbers, OU = Technology, CN = www.example.org
error 20 at 0 depth lookup: unable to get local issuer certificate
error mycert.pem: verification failed
이러한 인증서 체인을 오프라인으로 확인하는 올바른 방법은 무엇입니까?
답변1
확인하려는 인증서를 한 파일에 넣고 체인을 다른 파일에 넣어야 합니다.
openssl verify -CAfile chain.pem mycert.pem
물론, openssl
chain.pem에 루트 인증서가 포함되어 있지 않은 경우 루트 인증서를 찾는 방법을 아는 것도 중요합니다. 이 작업을 수행해야 하는 경우(자체 CA를 사용하는 경우) 다음에서 찾을 대체 디렉터리를 지정할 수도 있습니다.-CApath
답변2
그래서 OpenSSL은 파일의 첫 번째 인증서만 확인한다는 답을 찾았습니다. 이는 유효한 체인이 있는 경우에만 마지막 인증서를 확인해야 함을 의미합니다.
답변3
certtool
와 의 조합으로 원하는 결과를 얻을 수 있습니다 openssl
. 여기에는 두 가지 작업이 관련되어 있다는 점에 주목할 가치가 있습니다. 하나는 체인 자체를 확인하는 것이고, 다른 하나는 로컬에 설치된 신뢰할 수 있는 루트 인증서에 의해 체인이 신뢰되는지 확인하는 것입니다.
경고: 부정적인 사례를 확인하세요.
부정적인 사례가 있는지 확인하십시오. 즉, 테스트에서 유효하지 않은 것으로 간주되어야 하는 것을 유효하지 않은 것으로 올바르게 처리하는지 확인하십시오. 당신은 이것을 할 수 있습니다https://badssl.com/아니면 스스로 만든 것. 무엇을 테스트하든 부정적인 사례가 실패할 것인지 확신할 수 없다면 테스트는 별로 도움이 되지 않습니다.
체인이 신뢰할 수 있는지 확인하십시오.
openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null \
| sed -ne '/-BEGIN/,/-END/p' \
| certtool --verify
체인 일관성만 확인하고 신뢰는 확인하지 않음:
openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null \
| sed -ne '/-BEGIN/,/-END/p' \
| certtool --verify-chain
신뢰할 수 있는 체인의 예:
$ openssl s_client -showcerts -connect example.com:443 </dev/null 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' | certtool --verify
Loaded system trust (154 CAs available)
Subject: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Issuer: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Checked against: CN=DigiCert Global Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Verified. The certificate is trusted.
Subject: CN=www.example.org,OU=Technology,O=Internet Corporation for Assigned Names and Numbers,L=Los Angeles,ST=California,C=US
Issuer: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Checked against: CN=DigiCert SHA2 Secure Server CA,O=DigiCert Inc,C=US
Signature algorithm: RSA-SHA256
Output: Verified. The certificate is trusted.
Chain verification output: Verified. The certificate is trusted.
신뢰할 수 없는 체인의 예:
$ openssl s_client -showcerts -connect untrusted-root.badssl.com:443 </dev/null 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' | certtool --verify
Loaded system trust (154 CAs available)
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
Chain verification output: Not verified. The certificate is NOT trusted. The certificate issuer is unknown.
신뢰할 수 없는 체인이 유효한지 확인하세요.
$ openssl s_client -showcerts -connect untrusted-root.badssl.com:443 </dev/null 2>/dev/null | sed -ne '/-BEGIN/,/-END/p' | certtool --verify-chain
Subject: CN=*.badssl.com,O=BadSSL,L=San Francisco,ST=California,C=US
Issuer: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Checked against: CN=BadSSL Untrusted Root Certificate Authority,O=BadSSL,L=San Francisco,ST=California,C=US
Signature algorithm: RSA-SHA256
Output: Verified. The certificate is trusted.
Chain verification output: Verified. The certificate is trusted.
답변4
문제는 -showcerts
명령의 출력에 있습니다. 인증서와 이에 서명한 인증서만 있고 중간 인증서도 있을 수 있지만 전체 체인은 없습니다. OK 명령문을 얻으려면 다음을 수행해야 합니다.
- 인증서(첫 번째
-BEGIN END-
블록)를 파일에 넣으세요.mycert.crt
- 다른 것들은 파일에 넣어라
CAcerts.crt
openssh -text -in CAcerts.crt
이에 서명한 루트 CA를 찾아 확인하고CAfile.crt
.- CA가 여전히 루트 CA(자체 서명)가 아닌 경우 이 작업을 반복할 수 있습니다.
- 그런 다음 인증서를 확인하세요.
openssl verify -CAfile CAcerts.crt mycert.crt
참고: 환경 설정 GUI(인증서 보기 및 내보내기)를 사용하여 Firefox 스토어에서 또는 certutil
Firefox 프로필 디렉토리를 사용하여 명령줄에서 잘 알려진 CA 인증서를 얻을 수 있습니다. 예를 들어:
$ find $HOME/.mozilla/firefox -name cert8.db # point for example to abcdef.default directory
$ certutil -a -L -d $HOME/.mozilla/firefox/abcdef.default/ -n "Let's Encrypt` Authority X3"