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

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

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

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



답변

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

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

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


답변

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

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

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

결과 :

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

답변

다음은 이 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;


답변

파일에있는 모든 인증서의 요약을 표시하는 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


답변

이것은 예쁘거나 우아하지는 않지만 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 옵션을 조정하십시오. 나는 이것을 위해 더 우아한 해결책이 있기를 정말로 원하지만,이 경우 더 우아한 해결책을 찾는 것은 우아하지 않은 것을 해킹하는 것보다 더 많은 시간이 걸렸을 것이라고 생각합니다.


답변

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 줄을 찾아 번들을 인증서로 분할합니다. 두 번째 명령은 추출 된 인증서를 반복하여 보여줍니다.


답변

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

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