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


25

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

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

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

BEGINEND태그 사이에있는 루트 인증서의 중간 내용을 원합니다 .
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.