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


25

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

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

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

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

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

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


누가 그 증명서를 발급했는지 알려주십시오.
— Rui F Ribeiro

@RuiFRibeiro 누군가에게 말해 봅시다 ... 기본 인증서 만 가지고있는 스택 교환을위한 인증서 체인을보고 싶습니다.
— Anirban Nag 'tintinmj'5

답변:


25

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

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 명령이 있다고 생각하지 않습니다.


이것이 주요 문제입니다. 나와 함께 URL이 없습니다. 인증서 파일 만 있습니다. 그리고 사이의 암호화 된 콘텐츠를 필요로 BEGIN하고 END당신이 바로 뒤에 얻을 것이다 태그 ( cat.가 .crt 파일을 보내고
— Anirban 잔소리 'tintinmj'

@ AnirbanNag'tintinmj '인증서를 해독하려는 경우openssl x509 -in file.crt -noout -text
— derobert

BEGIN와 END태그 사이에있는 루트 인증서의 중간 내용을 원합니다 .
— Anirban Nag 'tintinmj'5

또는 기본 인증서에서 중간 및 루트 인증서를 추출하여 파일로 저장하는 명령을 제공 할 수 있다면 ... 나도 함께 살 수 있습니다.
— Anirban Nag 'tintinmj'5

@ AnirbanNag'tintinmj ' openssl x509명령 과 함께 표시 되지 않으면 중간 인증서가 있다고 생각하지 않습니다. (에서 오류가 발생하지 않는 한 openssl x509).
— derobert

12

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

형식을 바꾸지 않고 이름을 바꾸는 것만으로 확장자를 ".pem"대 ".crt"로 선택해야하는 이유가 있습니까?
— 캡틴 맨

아니 정말. ".pem"은 형식 (DER의 base64)입니다. ".crt"는 인증서이지만 인코딩에 대해서는 아무 것도 알려주지 않습니다. 일관성을 높이고 모든 pem의 이름을 지정하려고했습니다 ...하지만 인증서가 다운로드되는 곳 (crt)을 이해하고 Linux 세계에서 일반적으로 사용하는 것을 끝내기 위해 한 라이너에서 읽는 것이 더 간단하다고 생각합니다 (pem) . ...이 관계를 설명 물건을 조금 희망
— estani

1
예, PEM이 형식이라는 것을 알고 있지만 종종 crt를보고 형식인지 확실하지 않았습니다. 이것은 실제로 왜 "crt"가 그렇게 자주 사용되는지 설명하는 데 도움이됩니다. 감사합니다 :)
— 캡틴 맨

이것은 이미 소스를 신뢰하는 경우에만 작동하는 것 같습니다. 사용자 지정 CA를 다운로드하려고하지만 체인이 아닌 첫 번째 인증서 만 다운로드하고 있습니다.
— mjaggard

그 경우에 정확하게 사용했기 때문에 @mjaggard가 이상합니다. 즉, 서버가 루트 CA를 전혀 보내지 않을 수도 있습니다. 내 예제를 살펴보면 3 개의 인증서를 다운로드하는 데 사용되었습니다 .2 만 다운로드 중입니다. 나는 Wikipedia 서버가 루트를 보내지 않는다고 가정합니다 (실제로 없습니다 포인트가 없다면, 어쨌든 그것을 믿지 않을 것입니다 ...). 나는 그것이 전에는 사실이 아니라고 확신합니다.
— estani
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.