답변:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 은이 단일 라이너를 제안합니다.
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
그것은 실제로 나를 위해 일했지만 세부 사항을 이해하지 못하므로주의 사항이 있는지 말할 수 없습니다.
/etc/ssl/certs/ca-certificates.crt
하고 있어요unable to load PKCS7 object
자바 keytool
는 트릭을 수행합니다.
keytool -printcert -v -file <certs.crt>
주석 : Windows 더블 클릭이 작동하지 않습니다. Windows는 키 저장소에서 첫 번째 인증서 만 읽고 기본 제공 인증서 저장소에서 신뢰 체인을 자동으로 확장합니다.
결과 :
.crt
파일 의 첫 번째 인증서 이외의 모든 것은 표시되지 않습니다.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 줄을 찾아 번들을 인증서로 분할합니다. 두 번째 명령은 추출 된 인증서를 반복하여 보여줍니다.
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-인증서 키 매처
다음은 중간 파일에 의존하지 않는 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에 전달합니다.
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 }'
.
나는 관용적 펄 명령 줄을 여기에 던지고 싶습니다 :
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의 값을 변경하십시오.
전체 체인을 볼 수있는 한 가지 방법은 (물론 Windows에서) crt를 두 번 클릭하고 인증 경로 탭을 보는 것입니다. 중간 또는 루트 인증서 만있는 경우에도 전체 체인을 표시합니다. 자세한 내용은 아래 스크린 샷을 참조하십시오. Windows를 사용하지 않는 경우 Unix / Linux 변형에 대한 지식이 부족하다고 사과드립니다.
참고 : 중간 인증서가 로컬 키 저장소에있는 경우 Windows에서이를 자동으로 추가하고 번들에있는 항목 만 표시하지 않으면 잘못된 결과가 발생할 수 있습니다.
나는 당신의 초기 명령을 간과했고 당신은 한 가지를 벗어났습니다. 명령은 다음과 같아야합니다.
openssl x509 -in bundle.crt -noout -text
출처 : http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
호출로 구문 오류가 발생했지만 번들의 첫 번째 인증서 만 나열했다고 불평하지 않았습니다 . 둘째, 두 호출은 기능적으로 동일합니다. 셋째, 그리고 아마도 가장 중요한 것은 당신도 적어도 저에게는 효과가 없다는 것입니다. 또한 번들의 첫 번째 인증서 만 나열합니다.