Bagaimana cara melihat semua sertifikat ssl dalam satu bundel?

102

Saya memiliki file .crt bundel sertifikat.

melakukan openssl x509 -in bundle.crt -text -noouthanya menunjukkan sertifikat root.

bagaimana saya melihat semua sertifikat lainnya?

pdeva
sumber

Jawaban:

121

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.

Beni Cherniavsky-Paskin
sumber
9
Ini adalah jawaban terbaik - Saya bahkan tidak akan memposting solusi Python over-kill saya! Biarkan "-teks" untuk mendapatkan info subjek / penerbit untuk setiap sertifikat.
Chris Wolf
Mencoba /etc/ssl/certs/ca-certificates.crtdan mendapatkannyaunable to load PKCS7 object
OrangeDog
1
Bukankah ini untuk format pkcs7, sedangkan pertanyaannya adalah tentang bundel format x509?
Yetanotherjosh
3
Hanya menggunakan pkcs7 sebagai perantara. Input dipatenkan PEM.
Beni Cherniavsky-Paskin
Kamu Super!!!
Jingguo Yao
22

Java keytoolmelakukan 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:

  1. Semua di luar sertifikat pertama dalam .crtfile tidak ditampilkan
  2. Anda mungkin menampilkan rantai trust yang berbeda dari yang Anda miliki di .crtfile. Ini bisa mengarah pada kesimpulan yang salah.
Jan Wunderlich
sumber
Terima kasih telah memperjelas masalah windows. Ini benar-benar membingungkan saya
Nick.McDermaid
21

Mengikuti FAQ ini membawa saya ke skrip perl ini , yang sangat sangat menyarankan kepada saya yang openssltidak 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 <[email protected]>
# v0.0.2         Tom Yates <[email protected]>
#

$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;
MadHatter
sumber
10

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
bahaya
sumber
Hal ini perlu penjelasan yang lebih baik
Sven
3

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.

pengguna2856925
sumber
3

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.

Raghu Dodda
sumber
1
Fitur pengalihan cetak dalam awk tersedia dalam gawk dan nawk tetapi tidak pada awk dasar. Jadi, ini akan bekerja di Linux (gawk ditautkan sebagai awk), tetapi mungkin tidak pada OS X yang memiliki awk dasar.
Raghu Dodda
1

Dalam bash biasanya hanya diperlukan satu baris (panjang) kode :-)

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

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

Lavermil
sumber
0

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.

Joe
sumber
2
Hanya untuk bersenang-senang: 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 }'.
Manav
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.

Gerard ONeill
sumber
-2

Metode Windows

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.

                                      masukkan deskripsi gambar di sini

Linux (Metode Ubuntu)

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

Brad Bouchard
sumber
Benarkah? Saya tahu ini sublte tetapi Anda benar-benar tidak tahu? My adalah openssl x509 -dalam bundle.crt -tidak -teks, sedangkan milik Anda memiliki -teks -tidak ... karena itu mengapa Anda mungkin mendapatkan kesalahan sintaksis.
Brad Bouchard
20
Pegang kudamu, Brad. Pertama, OP tidak mengeluh bahwa opensslpermintaannya 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.
MadHatter
Ya, saya tidak seperti di Ubuntu untuk hal-hal seperti ini dan berpikir dia ada di Windows sampai dia mengatakan sebaliknya. Jadi saya tidak ingin membiarkan OP tergantung dan setelah saya melakukan sedikit pencarian menemukan bahwa situs referensi untuk jenis-jenis perintah ini mencantumkan perintah yang saya berikan kepadanya (yang dengan sintaks yang sedikit berbeda) dan ingin melihat apakah itu bisa Tolong. Poin Anda diambil, tapi tolong lakukan dengan lebih banyak waktu berikutnya.
Brad Bouchard