Jawaban:
http://comments.gmane.org/gmane.comp.encryption.openssl.user/43587 menyarankan ini satu-baris:
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -text -noout
Ini memang bekerja untuk saya, tetapi saya tidak mengerti detailnya sehingga tidak bisa mengatakan apakah ada peringatan.
/etc/ssl/certs/ca-certificates.crt
dan mendapatkannyaunable to load PKCS7 object
Java keytool
melakukan trik:
keytool -printcert -v -file <certs.crt>
Anotasi: Klik ganda Windows tidak berfungsi. Windows hanya membaca sertifikat pertama di keystore dan secara otomatis memperluas trustchain dari toko sertifikat bawaannya.
Hasil:
.crt
file tidak ditampilkan.crt
file. Ini bisa mengarah pada kesimpulan yang salah.Mengikuti FAQ ini membawa saya ke skrip perl ini , yang sangat sangat menyarankan kepada saya yang openssl
tidak memiliki dukungan asli untuk menangani sertifikat ke- n dalam sebuah bundel, dan bahwa alih-alih kita harus menggunakan beberapa alat untuk mengiris-iris input sebelum memberi makan masing-masing sertifikat ke . Skrip perl ini, yang diadaptasi secara bebas dari skrip Nick Burch yang ditautkan di atas, tampaknya melakukan tugasnya:openssl
#!/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 yang menampilkan ringkasan setiap sertifikat dalam file.
openssl crl2pkcs7 -nocrl -certfile CHAINED.pem | openssl pkcs7 -print_certs -noout
(commando serupa disebutkan dalam jawaban lain, tetapi ini memberikan hasil yang lebih pendek, tanpa opsi --text).
contoh:
$ 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
Ini mungkin tidak cantik, atau elegan, tapi itu cepat dan bekerja untuk saya menggunakan bash di linux, dan PEM diformat blok dalam file bundel ca-cert.
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
Anda dapat menempatkan semuanya satu baris, dan menyesuaikan opsi openssl agar sesuai. Saya benar-benar berharap ada solusi yang lebih elegan untuk ini, tetapi dalam hal ini saya pikir menemukan solusi yang lebih elegan akan membutuhkan waktu lebih lama daripada meretas solusi yang tidak elegan.
Karena tidak ada solusi berbasis 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
Perintah pertama memecah bundel menjadi sertifikat dengan mencari BEGIN, dan END lines. Perintah kedua loop melalui sertifikat diekstraksi dan menunjukkannya.
Perubahan kecil pada posting MadHatter untuk memungkinkan Anda menyalin / menempel langsung ke CLI. Saya juga menyertakan hash MD5, yang sangat membantu ketika memastikan sertifikat sudah benar. Baris stdin yang dikembalikan adalah hash md5 dari sertifikat.
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
Jika Anda ingin melihat hasil ringkas singkat yang bagus, Anda menggunakan versi ini. Bermanfaat jika Anda hanya memeriksa bahwa Anda telah memasukkan semua sertifikat Anda, tetapi tidak benar-benar memeriksa penggunaan / etc dari sertifikat tersebut.
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
Hanya dalam kasus versi openssl Anda tidak mendukung semua bendera di sini adalah beberapa egrep yang dapat Anda gunakan. Hal yang sama seperti yang pertama tetapi hanya pipa ke egrep.
perl -e '.....
' < my_id_cert_and_ca_bundle.crt | egrep "Serial|Subject:|Not |Public-Key|^Cert|stdin|ssuer"
Untuk memeriksa hash MD5 dari kunci pribadi Anda dapat melakukan hal berikut.
openssl rsa -tidak ada -modulus -in privateKey.key | openssl md5
Referensi: SSL Shopper - Pencocokan Kunci Sertifikat
Inilah solusi berbasis awk yang tidak bergantung pada file perantara.
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
Ia bekerja dengan membaca blok PEM dari stdin dan menyatukan setiap blok ke baris base64 tunggal yang disandikan. Baris kemudian dibaca, didekodekan, dan diteruskan ke openssl sebagai sertifikat penyandian DER.
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 }'
.
Saya ingin memasukkan perintah perl idiomatik di sini:
perl -ne "\$n++ if /BEGIN/; print if \$n == 1;" mysite.pem
Jika ada teks maka perubahan sedikit lebih kuat:
perl -ne "\$n++ if /^-----BEGIN CERTIFICATE-----\$/; print if \$n == 3 && /^-----BEGIN CERTIFICATE-----\$/.../^-----END CERTIFICATE-----\$/;" mysite.pem
Cukup ubah nilai apa yang seharusnya dalam pernyataan kedua untuk mendapatkan sertifikat ke-n.
Salah satu cara Anda dapat melihat seluruh rantai (di Windows tentu saja) untuk mengklik dua kali crt dan kemudian melihat pada tab Jalur Sertifikasi. Ini akan menampilkan seluruh rantai bahkan jika hanya ada Sertifikat Menengah, atau Root. Lihat tangkapan layar di bawah untuk detailnya. Jika Anda tidak menggunakan Windows, saya minta maaf atas kurangnya pengetahuan saya dengan varian Unix / Linux.
Catatan: ini dapat menyebabkan hasil yang salah jika sertifikat perantara ada di dalam keystore lokal Anda Windows akan menambahkannya secara otomatis dan tidak hanya memperlihatkan apa yang ada dalam bundel.
Saya mengabaikan perintah awal Anda dan Anda memiliki satu hal yang tidak pada tempatnya. Perintah Anda akan terlihat seperti ini:
openssl x509 -in bundle.crt -noout -text
Sumber: http://manpages.ubuntu.com/manpages/hardy/man1/x509.1ssl.html
openssl
permintaannya memberikan kesalahan sintaksis, tetapi bahwa itu hanya mencantumkan sertifikat pertama dalam bundel. Kedua, kedua doa itu identik secara fungsional. Ketiga, dan mungkin yang paling penting, milik Anda juga tidak berfungsi, setidaknya untuk saya; itu juga, hanya mencantumkan sertifikat pertama dalam bundel.