bagaimana cara mengunduh sertifikat ssl dari situs web?

Jawaban:

246

Untuk mengunduh sertifikat, Anda harus menggunakan klien yang terintegrasi dengan openssl seperti:

echo -n | openssl s_client -connect HOST:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

Itu akan menyimpan sertifikat /tmp/$SERVERNAME.cert.

Anda dapat menggunakan -showcertsjika Anda ingin mengunduh semua sertifikat dalam rantai. Tetapi jika Anda hanya ingin mengunduh sertifikat server, tidak perlu menentukan-showcerts

echo -n memberikan respons ke server, sehingga koneksi dilepaskan

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'menghapus informasi tentang rantai sertifikat dan detail koneksi. Ini adalah format yang disukai untuk mengimpor sertifikat ke keystore lain.

Sean Reifschneider
sumber
9
hargai bahwa Anda tidak hanya memberikan jawaban yang baik, tetapi juga penjelasan yang tepat.
marco.m
Apakah -showcertsmenunjukkan sertifikat server / daun juga? Saya pikir itu hanya menampilkan perantara ketika saklar itu dimasukkan.
Mike B
Seperti jawabannya, s_clientselalu tunjukkan sertifikat server (jika ada, yaitu server merespons halo dan tidak memilih suite anonim). -showcertsmenunjukkan semua sertifikat yang diterima, server cert pertama kemudian perantara dan / atau root.
dave_thompson_085
4
ini tidak bekerja di hadapan proxy.
Frederick Nord
2
Ini juga tidak berfungsi dengan server yang menggunakan SNI (beberapa sertifikat / domain pada satu alamat IP). Untuk menghindari masalah, tentukan parameter servername openssl: openssl s_client -connect PEMBAWA ACARA: PORTNUMBER -servername CN
verhage
60

Saya menemukan jawabannya. Openssl menyediakannya.

openssl s_client -connect $ {REMHOST}: $ {REMPORT}

RainDoctor
sumber
2
juga openssl x509 -text <<EOF cert-text EOFuntuk melihat detail sertifikat
mpapis
2
sudo rm -f cert.pem && sudo echo -n | openssl s_client -connect localhost:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./cert.pemmilik serverfault.com/questions/139728/…
pulkitsinghal
ini menyelesaikan hal yang sama dan melompati sedhack.
phs
Ini hanya memeriksa satu sertifikat, bagaimana jika layanan ini merupakan bagian dari kelompok server yang seimbang, yang masing-masing memiliki sertifikat yang berbeda, mungkin ditandatangani oleh CA root yang berbeda? Atau dengan kata lain, serangan mitm mungkin membiarkan permintaan ini melalui situs asli, dan kemudian mengarahkan permintaan lain ke server-nya. Apakah ada cara untuk memeriksa ini? Dan untuk mendapatkan daftar semua sertifikat yang benar-benar dimiliki domain?
Jens Timmerman
@JensTimmerman "Atau dengan kata lain, serangan mitm mungkin membiarkan permintaan ini masuk ke situs asli, dan kemudian mengarahkan permintaan lain ke server-nya." Itu tidak mungkin kecuali man-in-the-middle memiliki sertifikat yang valid untuk server target (atau klien bodoh tidak memeriksa sertifikat server). Jelas, jika server terkadang menawarkan sertifikat yang berbeda, Anda hanya bisa berharap pada akhirnya mendapatkan semuanya dengan mengulangi upaya koneksi.
David Tonhofer
22

The GnuTLS alat klien, gnutls-cli, juga dapat membuat ini mudah:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

Program ini dirancang untuk menyediakan klien interaktif ke situs, sehingga Anda harus memberikan input kosong (dalam contoh ini, dari /dev/null) untuk mengakhiri sesi interaktif.

hidung besar
sumber
1
bagaimana hal itu membuat gnutl terhubung melalui (https luas konfigurasi sistem) dan mencetak sertifikat yang ditukar?
Frederick Nord
9

berdasarkan jawaban @bignose, berikut ini adalah versi lengkap yang cocok untuk misalnya resep koki:

sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
sudo update-ca-certificates
oDDsKooL
sumber
6
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

mode openssl ini mengharapkan stdin, jadi kami menyediakannya melalui true |, ini terhubung ke server yang ditentukan dalam parameter -connect. 2>/dev/nullkesalahan hening (opsional), kita dapat melewatkan seluruh output ke parser x509, yang menentukan /dev/stdinuntuk menggunakan pipa shell sebagai file input. Dan itu akan menampilkan hanya -----BEGIN CERTIFICATE-----untuk -----END CERTIFICATE-----sebagian dari s_clientoutput. Anda bisa mengarahkan itu ke file dengan menambahkan > google.com.pemke akhir perintah.


Yang terbaik yang saya tahu, ini tidak memverifikasi rantai sertifikat, itu hanya dapat memberi tahu Anda apa ssl identitas yang disediakan server akhir.

ThorSummoner
sumber
2
(1) ini tidak benar-benar meningkatkan jawaban dari 6 tahun yang lalu (2) x509membaca stdin secara default sehingga -in /dev/stdinredundan (3) s_clientmemverifikasi server cert dengan benar rantai ke jangkar kepercayaan lokal (root) dan tidak kedaluwarsa, tetapi Anda belum menekan informasi yang akan menunjukkan ini (4) itu TIDAK memeriksa pembatalan (5) itu memeriksa nama di server cert hanya di 1.0.2 dan kemudian tidak secara default (tetapi Anda dapat dengan mudah memeriksa sendiri dengan melihat sertifikat itu sesudahnya)
dave_thompson_085
@ dave_thompson_085, pertanyaannya adalah bagaimana cara mengunduh sertifikat, tetapi tidak menunjukkan informasi berantai. Saya suka openssl x509 jauh lebih baik daripada sed dalam jawaban lain.
Der_Meister
0

Sintaks alternatif menggunakan Ex dan proses substitusi:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
kenorb
sumber