Catatan: Ini sebenarnya bukan pertanyaan karena saya sudah menemukan jawabannya tetapi karena saya tidak menemukannya dengan mudah di sini saya akan mempostingnya sehingga dapat bermanfaat bagi orang lain.
Pertanyaan: Bagaimana cara membaca file PEM gabungan sebagai yang digunakan oleh apache / mod_ssl directive SSLCACertificateFile ?
Jawab (asli) ( sumber ):
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
Ini dapat meninggalkan file kosong jika ada baris kosong di bagian akhir, seperti dengan openssl pkcs7 -outform PEM -in my-chain-file -print_certs
. Untuk mencegahnya, periksa panjang garis sebelum mencetak:
cat $file|awk 'split_after==1{n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{if(length($0) > 0) print > "cert" n ".pem"}'
Jawab 29/03/2016 :
Mengikuti jawaban @slugchewer , csplit
mungkin opsi yang lebih jelas dengan:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
openssl
yang mengambil satu sertifikat untuk dianalisis.Jawaban:
Cuplikan awk berfungsi untuk mengekstraksi bagian yang berbeda, tetapi Anda masih perlu tahu bagian mana yang merupakan kunci / sertifikat / rantai. Saya perlu mengekstrak bagian tertentu, dan menemukan ini di milis OpenSSL: http://openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html
sumber
Ini sebelumnya dijawab di StackOverflow :
Sunting 29/03/2016 : Lihat jawaban @slugchewer
sumber
The
split
perintah tersedia pada kebanyakan sistem, dan doa yang cenderung lebih mudah untuk diingat.Jika Anda memiliki file
collection.pem
yang ingin Anda bagi menjadiindividual-*
file, gunakan:Jika belum
split
, Anda dapat mencobacsplit
:sumber
-p
opsi (atau halaman manual yang saya baca ) secara terpisah. Mungkin Anda menggunakan biner / paket khususcsplit
sebagai gantinya ... (lihat edit di atas)csplit
!csplit: *}: bad repetition count
(tapi perpecahan tampaknya berhasil)Jika Anda ingin mendapatkan satu sertifikat dari bundel PEM multi-sertifikat, coba:
openssl
perintah pertama akan memproses file PEM dan memuntahkannya dengan pra-pended"subject:"
dan"issuer:"
baris sebelum setiap sertifikat. Jika PEM Anda sudah diformat dengan cara ini, yang Anda butuhkan hanyalahawk
perintah terakhir .source1 , source2
sumber
Juga patut dicatat bahwa file PEM hanya kumpulan kunci / sertifikat di dalam
BEGIN
/END
blok, jadi cukup mudah untuk hanya memotong / menempelkan jika itu hanya satu file dengan satu atau dua entitas yang menarik ...sumber
Jika Anda menangani sertifikat rantai penuh (yaitu yang dihasilkan oleh letsencrypt / certbot dll), yang merupakan gabungan dari sertifikat dan rantai otoritas sertifikat, Anda dapat menggunakan manipulasi string bash.
Sebagai contoh:
Untuk mengekstrak sertifikat dan rantai otoritas sertifikat ke dalam variabel:
Penjelasan:
Alih-alih menggunakan awk atau openssl (yang merupakan alat yang kuat tetapi tidak selalu tersedia, yaitu dalam gambar Docker Alpine), Anda dapat menggunakan manipulasi string bash.
"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
: dari akhir konten FULLCHAIN, kembalikan pertandingan substring terpanjang, lalu selesaikan-----END CERTIFICATE-----
saat dilucuti. The*
pertandingan semua karakter setelah-----END CERTIFICATE-----
.$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')
: dari awal konten FULLCHAIN, kembalikan pertandingan substring terpendek, lalu hapus baris baru. Demikian juga,*
cocok dengan semua karakter sebelumnya-----END CERTIFICATE-----
.Untuk referensi cepat (sementara Anda dapat menemukan lebih banyak tentang manipulasi string di bash di sini ):
${VAR#substring}
= substring terpendek dari awal konten VAR${VAR%substring}
= substring terpendek dari akhir konten VAR${VAR##substring}
= substring terpanjang dari awal konten VAR${VAR%%substring}
= substring terpanjang dari akhir konten VARsumber
Hmmm ... cara yang hampir sama saya menyiapkan solusinya (seperti yang disarankan y @Cerber) tanpa menyadari bahwa situasi ini tampaknya sudah dimiliki banyak orang. Solusi saya mengikuti logika yang hampir sama tetapi menggunakan beberapa perintah yang lebih mendasar:
Semua sertifikat saya ada di file:
certin.pem
Ini pada dasarnya terus menulis dalam file sampai menemukan "SELESAI" dan kemudian mulai menulis ke file lain dengan cara bertahap. Dengan cara ini Anda akan memiliki "N" jumlah file output ( certout0.pem, certout1.pem dan sebagainya ..) file tergantung pada berapa banyak sertifikat yang ada di file input pem Anda ( certin.pem ).
sumber