번들에서 모든 SSL 인증서를 보는 방법은 무엇입니까?


101

인증서 번들 .crt 파일이 있습니다.

하고 openssl x509 -in bundle.crt -text -noout만 것은 루트 인증서를 보여줍니다.

다른 모든 인증서는 어떻게 볼 수 있습니까?

답변:


120

http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 은이 단일 라이너를 제안합니다.

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout

그것은 실제로 나를 위해 일했지만 세부 사항을 이해하지 못하므로주의 사항이 있는지 말할 수 없습니다.


9
이것이 최선의 답변입니다-나는 죽여 버린 파이썬 솔루션을 게시하지 않을 것입니다! 각 인증서에 대한 주체 / 발급자 정보를 얻으려면 "-텍스트"를 생략하십시오.
Chris Wolf

에 그것을 시도 /etc/ssl/certs/ca-certificates.crt하고 있어요unable to load PKCS7 object
OrangeDog

1
이것은 pkcs7 형식이 아닌가, x509 형식 번들에 관한 질문입니까?
Yetanotherjosh

3
pkcs7 만 중간으로 사용합니다. 입력이 연결된 PEM입니다.
베니 체르니 아프 스키-파 스킨

넌 최고야!!!
Jingguo Yao

21

자바 keytool는 트릭을 수행합니다.

keytool -printcert -v -file <certs.crt>

주석 : Windows 더블 클릭이 작동하지 않습니다. Windows는 키 저장소에서 첫 번째 인증서 만 읽고 기본 제공 인증서 저장소에서 신뢰 체인을 자동으로 확장합니다.

결과 :

  1. .crt파일 의 첫 번째 인증서 이외의 모든 것은 표시되지 않습니다
  2. .crt파일에 있는 것과 다른 신뢰 체인이 표시 될 수 있습니다 . 잘못된 결론으로 ​​이어질 수 있습니다.

Windows를 명확히 해 주셔서 감사합니다. 이건 정말 나를 혼란스럽게 했어
Nick.McDermaid

21

다음은 이 FAQ 를 알려준 이 펄 스크립트 매우 강하게 나에게 제안, openssl취급에 대한 네이티브 지원이없는 N 번째 번들에 인증서를하고, 그 대신 우리는 서로를 공급하기 전에 입력을 -와 - 주사위를 슬라이스 몇 가지 도구를 사용해야합니다 에 인증서 openssl. 위에 링크 된 Nick Burch의 스크립트에서 자유롭게 수정 된이 펄 스크립트는 다음과 같은 역할을합니다.

#!/usr/bin/perl
# script for splitting multi-cert input into individual certs
# Artistic Licence
#
# v0.0.1         Nick Burch <nick@tirian.magd.ox.ac.uk>
# v0.0.2         Tom Yates <tyates@gatekeeper.ltd.uk>
#

$filename = shift;
unless($filename) {
  die("You must specify a cert file.\n");
}
open INP, "<$filename" or die("Unable to load \"$filename\"\n");

$thisfile = "";

while(<INP>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo \'$thisfile\' | openssl x509 -noout -text`;
      $thisfile = "";
   }
}
close INP;

10

파일에있는 모든 인증서의 요약을 표시하는 Oneliner

openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout

(다른 답변에서 언급 된 비슷한 특공대이지만 --text 옵션없이 출력이 짧습니다).

예:

$ openssl crl2pkcs7 -nocrl -certfile bundled.crt | openssl pkcs7 -print_certs -noout

subject=/C=NL/postalCode=5705 CN/L=City/street=Example 20/O=Foobar B.V./OU=ICT/OU=Wildcard SSL/CN=*.example.com
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Organization Validation Secure Server CA
issuer=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority

subject=/C=GB/ST=Greater Manchester/L=Salford/O=COMODO CA Limited/CN=COMODO RSA Certification Authority
issuer=/C=SE/O=AddTrust AB/OU=AddTrust External TTP Network/CN=AddTrust External CA Roo

더 나은 설명이 필요합니다
Sven

3

이것은 예쁘거나 우아하지는 않지만 Linux에서 bash를 사용하고 ca-cert 번들 파일의 PEM 형식 블록을 사용하여 빠르고 효과적이었습니다.

while read line
do
    if [ "${line//END}" != "$line" ]; then
        txt="$txt$line\n"
        printf -- "$txt" | openssl x509 -subject -issuer -noout
        txt=""
    else
        txt="$txt$line\n"
    fi
done < /path/to/bundle/file

한 줄에 모두 넣고 openssl 옵션을 조정하십시오. 나는 이것을 위해 더 우아한 해결책이 있기를 정말로 원하지만,이 경우 더 우아한 해결책을 찾는 것은 우아하지 않은 것을 해킹하는 것보다 더 많은 시간이 걸렸을 것이라고 생각합니다.


3

awk 기반 솔루션이 없기 때문에 :

$ cat ca-bundle | awk '/BEGIN/ { i++; } /BEGIN/, /END/ { print > i ".extracted.crt" }'
$ ls *.extracted.crt | while read cert; do openssl x509 -in $cert -text -noout; done

첫 번째 명령은 BEGIN 및 END 줄을 찾아 번들을 인증서로 분할합니다. 두 번째 명령은 추출 된 인증서를 반복하여 보여줍니다.


1
awk의 인쇄 리디렉션 기능은 gawk 및 nawk에서 사용할 수 있지만 기본 awk에서는 사용할 수 없습니다. 따라서 이것은 Linux에서 작동하지만 (gawk는 awk로 연결되어 있지만) 기본 awk가있는 OS X에서는 그렇지 않을 수 있습니다.
Raghu Dodda 1

1

bash에서는 일반적으로 한 줄의 코드 만 필요합니다 :-)

tfile=$( mktemp -u ) && \
csplit -z -q -f "$tfile" bundle.crt  '/----BEGIN CERTIFICATE-----/' '{*}' && \
find "${tfile%/*}" -name "${tfile##*/}*" -exec openssl x509 -noout -subject -in "{}" \; -delete

0

MadHatter의 게시물을 약간만 변경하면 CLI에 바로 복사 / 붙여 넣기가 가능합니다. 또한 인증서가 올바른지 확인하는 데 도움이되는 MD5 해시도 포함했습니다. 반환 된 stdin 줄은 인증서의 md5 해시입니다.

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -text`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5`;
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

짧은 간결한 출력을보고 싶다면이 버전을 사용하십시오. 모든 인증서를 포함했는지 확인하고 있지만 실제로 인증서 사용 / 등을 확인하지 않은 경우에 유용합니다.

perl -e 'my $thisfile = "";
foreach (<>) {
   $thisfile .= $_;
   if($_ =~ /^\-+END(\s\w+)?\sCERTIFICATE\-+$/) {
      print "Found a complete certificate:\n";
      print `echo "$thisfile" | openssl x509 -noout -serial -subject -dates -alias -issuer`;
      print `echo "$thisfile" | openssl x509 -noout -modulus | openssl md5` . "\n";
      $thisfile = "";
   }
}' < my_id_cert_and_ca_bundle.crt

openssl 버전이 모든 플래그를 지원하지 않는 경우를 대비하여 사용할 수있는 egrep이 있습니다. 첫 번째 것과 동일하지만 egrep으로 파이프하십시오.

perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"

개인 키의 MD5 해시를 확인하려면 다음을 수행하십시오.

openssl rsa -noout -modulus -in privateKey.key | openssl md5

참조 : SSL Shopper-인증서 키 매처


0

다음은 중간 파일에 의존하지 않는 awk 기반 솔루션입니다.

cat bundle.crt | awk '{
  if ($0 == "-----BEGIN CERTIFICATE-----") cert=""
  else if ($0 == "-----END CERTIFICATE-----") print cert
  else cert=cert$0
}' | while read CERT; do
  echo "$CERT" | base64 -d | openssl x509 -inform DER -text -noout
done

stdin에서 PEM 블록을 읽고 각 블록을 단일 base64 인코딩 라인으로 연결하여 작동합니다. 그런 다음 행을 읽고 디코딩하여 DER 인코딩 된 인증서로 openssl에 전달합니다.


2
재미로만 : cat bundle.crt | awk -v cmd="openssl x509 -subject -noout" '/-----BEGIN/ { c = $0; next } c { c = c "\n" $0 } /-----END/ { print c|cmd; close(cmd); c = 0 }'.
마나 브

0

나는 관용적 펄 명령 줄을 여기에 던지고 싶습니다 :

  perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem

텍스트가 있다면 약간 더 강건한 조정입니다.

 perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem

n 번째 인증서를 얻으려면 두 번째 명령문에서 n의 값을 변경하십시오.


-2

윈도우 방법

전체 체인을 볼 수있는 한 가지 방법은 (물론 Windows에서) crt를 두 번 클릭하고 인증 경로 탭을 보는 것입니다. 중간 또는 루트 인증서 만있는 경우에도 전체 체인을 표시합니다. 자세한 내용은 아래 스크린 샷을 참조하십시오. Windows를 사용하지 않는 경우 Unix / Linux 변형에 대한 지식이 부족하다고 사과드립니다.

참고 : 중간 인증서가 로컬 키 저장소에있는 경우 Windows에서이를 자동으로 추가하고 번들에있는 항목 만 표시하지 않으면 잘못된 결과가 발생할 수 있습니다.

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

리눅스 (우분투 방법)

나는 당신의 초기 명령을 간과했고 당신은 한 가지를 벗어났습니다. 명령은 다음과 같아야합니다.

openssl x509 -in bundle.crt -noout -text

출처 : http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html


정말? 나는 그것이 미묘하다는 것을 알고 있지만 실제로 말할 수는 없습니까? 내는 openssl x509 -in bundle.crt -noout -text이지만, 당신은 -text -noout ...을 가지고 있기 때문에 아마도 구문 오류가 발생합니다.
Brad Bouchard

20
말을 잡아라, 브래드 첫째, OP는 자신의 openssl호출로 구문 오류가 발생했지만 번들의 첫 번째 인증서 만 나열했다고 불평하지 않았습니다 . 둘째, 두 호출은 기능적으로 동일합니다. 셋째, 그리고 아마도 가장 중요한 것은 당신도 적어도 저에게는 효과가 없다는 것입니다. 또한 번들의 첫 번째 인증서 만 나열합니다.
MadHatter

그래, 나는 이와 같은 문제에 대해 우분투 측면에 있지 않고 그가 나에게 달리 말할 때까지 Windows에 있다고 생각했다. 그래서 나는 OP를 멈추고 싶지 않았고 약간의 검색을 한 후에 이러한 유형의 명령에 대한 참조 사이트가 내가 그에게 준 명령 (약간 다른 구문을 가진 명령)을 나열하고 그것이 가능한지보고 싶었다는 것을 발견했습니다. 도움. 당신의 요점은 취해졌지만 다음 번에는 더 많은 은혜로 해주십시오
Brad Bouchard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.