Linux의 인증서 체인에서 루트 CA 및 하위 CA를 추출하는 방법은 무엇입니까? cat최종 엔티티 인증서,

중간 및 루트 인증서가있는 최종 엔티티 / 서버 인증서가 있습니다. 나는 때 cat최종 엔티티 인증서, 나는 단 하나의 참조 BEGINEND태그를. 유일한 엔터티 인증서입니다.

중간 및 루트 인증서 내용을 볼 수있는 방법이 있습니까? 내용 BEGINEND태그 만 있으면됩니다 .

Windows에서는 “인증 경로”에서 전체 인증서 체인을 볼 수 있습니다. 아래는 Stack Exchange 인증서의 예입니다.

여기에 이미지 설명을 입력하십시오

거기에서 View Certificate를 수행 하고 내보낼 수 있습니다. Windows에서 루트 및 중간에 대해 그렇게 할 수 있습니다. Linux에서 동일한 방법을 찾고 있습니다.



답변

웹 사이트에서 다음을 수행 할 수 있습니다.

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

그러면 인증서 체인과 서버가 제시 한 모든 인증서가 표시됩니다.

이 두 인증서를 파일에 저장하면 openssl verify다음을 사용할 수 있습니다 .

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

-untrusted옵션은 중간 인증서를 제공하는 데 사용됩니다. se.crt확인할 인증서입니다. depth = 2 결과는 시스템의 신뢰할 수있는 CA 저장소에서 나온 것입니다.

중간 인증서가 없으면 확인을 수행 할 수 없습니다. 바로 X.509가 작동하는 방식입니다.

인증서에 따라 중간 인증서를 가져올 URI가 포함될 수 있습니다. 예를 들어, 다음을 openssl x509 -in se.crt -noout -text포함합니다.

        Authority Information Access:
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

“CA 발급자”URI는 중간 인증서 (DER 형식)를 가리 키므로 openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pemOpenSSL에서 나중에 사용할 수 있도록 변환하는 데 사용해야 합니다.

openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hashget 을 실행 하면 244b5494시스템 루트 CA 저장소에서 찾을 수 있습니다 /etc/ssl/certs/244b5494.0( .0이름에 추가 하십시오).

나는 당신을 위해 그 모든 것을 할 수있는 훌륭하고 쉬운 OpenSSL 명령이 있다고 생각하지 않습니다.


답변

tl; dr-체인의 모든 인증서를 덤프하는 하나의 라이너 bash 마술

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

2 단계 설명

체인의 모든 인증서를 현재 디렉토리에 덤프하려면 다음을 수행하십시오 cert${chain_number}.pem.

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}'

보너스 트랙을 일반적인 이름으로 바꿉니다.

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done