Bagaimana cara mengekstrak Root CA dan Subordinate CA dari rantai sertifikat di Linux?


25

Saya memiliki sertifikat entitas akhir / server yang memiliki sertifikat perantara dan root. Ketika saya catpada sertifikat entitas akhir, saya hanya melihat satu BEGINdan ENDtag. Ini adalah satu-satunya sertifikat entitas akhir.

Apakah ada cara saya dapat melihat konten sertifikat perantara dan root. Saya hanya perlu konten BEGINdan ENDtag.

Di Windows saya bisa melihat rantai sertifikat penuh dari "Jalur Sertifikasi". Di bawah ini adalah contoh untuk sertifikat Stack Exchange.

masukkan deskripsi gambar di sini

Dari sana saya dapat melakukan Lihat Sertifikat dan mengekspornya. Saya bisa melakukannya untuk root dan intermediate di Windows. Saya mencari metode yang sama di Linux.

masukkan deskripsi gambar di sini


Tolong beri tahu kami siapa yang memberikan Anda sertifikat itu.
Rui F Ribeiro

@RuiFRibeiro Katakanlah siapa pun ... Saya ingin melihat rantai sertifikat untuk stackexchange dengan hanya sertifikat utama di tangan.
Anirban Nag 'tintinmj'

Jawaban:


25

Dari situs web, Anda dapat melakukan:

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

Itu akan menunjukkan rantai sertifikat dan semua sertifikat yang disajikan server.

Sekarang, jika saya menyimpan kedua sertifikat itu ke file, saya dapat menggunakan openssl verify:

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt 
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

The -untrustedopsi digunakan untuk memberikan sertifikat menengah (s); se.crtadalah sertifikat untuk memverifikasi. Kedalaman = 2 hasil berasal dari toko CA sistem tepercaya.

Jika Anda tidak memiliki sertifikat perantara, Anda tidak dapat melakukan verifikasi. Itulah cara kerja X.509.

Tergantung pada sertifikat, itu mungkin berisi URI untuk mendapatkan perantara. Sebagai contoh, openssl x509 -in se.crt -noout -textmengandung:

        Authority Information Access: 
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

Itu "CA Issuers" URI menunjuk ke sertifikat menengah (dalam format DER, jadi Anda perlu menggunakannya openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pemuntuk mengubahnya untuk digunakan lebih lanjut oleh OpenSSL).

Jika Anda berlari openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hash Anda mendapatkan 244b5494yang Anda dapat mencari di CA toko sistem akar di /etc/ssl/certs/244b5494.0(hanya append .0ke nama).

Saya tidak berpikir ada perintah OpenSSL yang bagus dan mudah untuk melakukan semua itu untuk Anda.


Itulah masalah utamanya. Saya tidak punya URL dengan saya. Saya hanya punya file sertifikat. Dan saya memerlukan konten terenkripsi antara BEGINdan ENDtag (yang akan Anda dapatkan hanya setelah catfile .crt.
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj 'Jika Anda hanya ingin memecahkan kode sertifikat, cobaopenssl x509 -in file.crt -noout -text
derobert

Saya ingin konten perantara di cert root yang antara tag BEGINdan END.
Anirban Nag 'tintinmj'

Atau jika Anda dapat memberikan perintah yang akan mengekstrak sertifikat perantara dan root dari sertifikat utama dan menyimpannya ke dalam file ... Saya juga bisa melakukannya.
Anirban Nag 'tintinmj'

@ AnirbanNag'tintinmj 'Jika tidak muncul dengan openssl x509perintah, saya tidak berpikir sertifikat perantara ada di sana. (Kecuali jika Anda mendapat kesalahan dari openssl x509).
derobert

12

tl; dr - one liner bash magic untuk membuang semua sertifikat di rantai

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Penjelasan dalam 2 langkah

Untuk membuang semua sertifikat dalam rantai ke dir saat ini sebagai cert${chain_number}.pem:

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

bonus-track untuk mengubah nama mereka menjadi nama bersama:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Apakah ada alasan untuk memilih ".pem" versus ".crt" sebagai ekstensi karena Anda hanya mengganti nama saja, bukan mengubah formatnya?
Kapten Man

Tidak terlalu. ".pem" adalah format (base64 dari DER) ".crt" berarti sertifikat tetapi tidak memberi tahu apa-apa tentang penyandian. Saya hendak membuatnya lebih konsisten dan memberi nama semua pem ... Tapi saya pikir lebih mudah untuk membaca dalam satu liner untuk memahami di mana sertifikat tersebut diunduh (crt) dan menyelesaikan apa yang biasanya saya gunakan di dunia Linux (pem) . Semoga ini sedikit memperjelas hal ...
estani

1
Ya, saya menyadari PEM adalah format tetapi saya sering melihat crt dan tidak yakin apakah itu format. Ini sebenarnya membantu menjelaskan mengapa saya melihat "crt" sering digunakan. Terima kasih :)
Kapten Man

Tampaknya ini hanya berfungsi jika Anda sudah mempercayai sumbernya. Saya mencoba mengunduh CA khusus tetapi hanya mengunduh sertifikat pertama, bukan rantai.
mjaggard

@ Magjard aneh karena saya menggunakannya persis untuk kasus itu. Yang sedang berkata, server mungkin tidak mengirim root CA sama sekali, jika Anda melihat contoh saya, dulu mengunduh 3 sertifikat sekarang hanya mengunduh 2. Saya menganggap server wikipedia tidak mengirim root (benar-benar tidak ada titik, jika Anda tidak memilikinya, Anda tidak akan percaya lagi ...). Saya cukup yakin itu tidak terjadi sebelumnya.
Estani
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.