Bagaimana cara memverifikasi sidik jari SSL berdasarkan baris perintah? (wget, ikal, ...)


32

Menggunakan pengunduh situs web baris perintah, seperti wget, curlatau yang lainnya ... Dalam skrip ...

Saya memiliki sidik jari sertifikat SHA-1 dan SHA-256 dari sebuah situs web. Karena masalah keamanan ( 1 ) ( 2 ), saya tidak ingin menggunakan sistem otoritas sertifikat SSL publik. Sidik jari harus dikodekan dengan keras.

Bisakah aplikasi wget like memeriksa sidik jari SSL?

wget tidak memiliki fungsi seperti itu. ( 3 )

Menggunakan wget --ca-certificateatau curl --cacertsaya harus menjalankan otoritas sertifikat lokal saya sendiri, yang ingin saya cegah, karena itu menambah banyak kerumitan. Ini juga sangat sulit dan tidak ada yang pernah melakukan itu sebelumnya. ( 4 )

Apakah tidak ada alat, seperti
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com?

Solusinya tentu saja tidak harus rentan terhadap TOCTOU. ( 5 ) MITM dapat membiarkan sidik jari yang valid untuk permintaan klien openssl dan merusak permintaan wget berikut.


Mungkin perlu melakukan beberapa keajaiban OpenSSL seperti: cyberciti.biz/faq/…
Justin Andrusk

Pengunjung: harap perhatikan bahwa ini diposkan silang ke infosec SE . Salah satu jawaban diri disalin dari sana. Ini adalah perilaku yang disukai, btw.
Félix Saparelli

Jawaban:


31

Sumber

Instal perangkat lunak yang diperlukan:

apt-get install ca-certificates curl

Unduh sertifikat SSL publik:

openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt >./x.cert </dev/null

Atau lebih baik:

echo -n | openssl s_client -connect torproject.org:443 -CAfile /usr/share/ca-certificates/mozilla/DigiCert_Assured_ID_Root_CA.crt | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > ./torproject.pem

Dapatkan sidik jari SHA-1:

openssl x509 -noout -in torproject.pem -fingerprint -sha1

Dapatkan sidik jari SHA-256:

openssl x509 -noout -in torproject.pem -fingerprint -sha256

Secara manual membandingkan sidik jari SHA-1 dan SHA-256 dengan FAQ torproject.org: SSL .

.

Opsional membuat sertifikat-ca tidak berguna untuk tujuan pengujian. Menggunakan curl di sini, tetapi wget memiliki Bug bug dan tetap menggunakan ca-file.

sudo mv /usr/share/ca-certificates /usr/share/ca-certificates_

Unduh dengan ikal dan sertifikat yang disematkan:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html

ini tidak berfungsi di hadapan proxy, meskipun: - /
Frederick Nord

Harap perhatikan bahwa opsi -CAfile sepenuhnya diabaikan dalam contoh Anda.
Lars

11

Dalam tcsh:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout

3
bekerja di zsh, harus bekerja untuk bash juga
number5

10

Ini juga cukup:

openssl x509 -fingerprint -in server.crt

Tambahkan -md5opsi untuk mengambil Sidik Jari MD5. -md5harus tidak diletakkan di antara -indan server.crt.
林果 皞

4

Ini cukup mudah dilakukan dengan opensslperintah dan fungsionalitas kliennya.

Skrip kecil berikut akan mengambil domain tertentu (tanpa awalan https) dan sidik jari SHA-1, dan keluar tanpa kesalahan (0) jika sidik jari yang diambil cocok, tetapi dengan kode keluar 1 jika tidak ada yang cocok. Anda kemudian dapat memasukkannya ke dalam skrip Anda dengan hanya menguji kode keluar terakhir $?:

#! / bin / bash
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -tidak ada -fingerprint | cut -f2 -d '=' ` if ["$ 2" = "$ FPRINT"]; kemudian keluar 0 lain keluar 1 fi

Sangat rentan terhadap TOCTOU. [1] MITM dapat membiarkan sidik jari yang valid untuk permintaan klien openssl dan merusak permintaan wget berikut. [1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch

Benar, secara teori. Akan cukup mudah untuk memodifikasi wgetdan mengompilasinya dengan OpenSSL sehingga ia melakukan apa yang Anda inginkan sebaris, tetapi itu berada di luar cakupan jawaban AU.
ish

Jadi, bagaimana dengan menggunakan s_client untuk juga mengambil dokumen? Sesuatu seperti (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443seharusnya bekerja, bukan? Nah, Anda harus membagi info sesi SSL dari balasan konten yang sebenarnya.
taneli

3

sumber

#!/usr/bin/perl
# https://security.stackexchange.com/questions/20399/how-to-verify-the-ssl-fingerprint-by-command-line-wget-curl
# Code snippets taken from Net::SSLeay documentation and mildly modified.
# Requires a newer version of SSLeay (tested with 1.48)
# Needless to say, verify correct $host and $fingerprint before testing!!!

use Net::SSLeay qw(get_https3);

$host = "www.google.com";
$port = 443;
$fingerprint = "C1:95:6D:C8:A7:DF:B2:A5:A5:69:34:DA:09:77:8E:3A:11:02:33:58";

($p, $resp, $hdrs, $server_cert) = get_https3($host, $port, '/');
if (!defined($server_cert) || ($server_cert == 0)) {
    warn "Subject Name: undefined, Issuer  Name: undefined";
} elsif (Net::SSLeay::X509_get_fingerprint($server_cert, "sha1") ne $fingerprint) {
    warn 'Invalid certificate fingerprint '
        .  Net::SSLeay::X509_get_fingerprint($server_cert, "sha1")
        . ' for ' . Net::SSLeay::X509_NAME_oneline(
             Net::SSLeay::X509_get_subject_name($server_cert));
} else {
    print $p;
}

Seperti yang diuraikan dalam dokumentasi Net :: SSLeay, metode ini berarti verifikasi setelah transaksi HTTP, dan karenanya tidak boleh digunakan jika Anda ingin memverifikasi bahwa Anda sedang berbicara dengan server yang benar sebelum mengirimnya data. Tetapi jika semua yang Anda lakukan adalah memutuskan untuk mempercayai apa yang baru saja Anda unduh (yang sepertinya Anda berasal dari referensi # 4) Anda baik-baik saja.


1

Itu naskah saya sehari-hari:

curl --insecure -v https://www.google.com 2>&1 | awk 'BEGIN { cert=0 } /^\* Server certificate:/ { cert=1 } /^\*/ { if (cert) print }'

Ouput:

* Server certificate:
*    subject: C=US; ST=California; L=Mountain View; O=Google Inc; CN=www.google.com
*    start date: 2016-01-07 11:34:33 GMT
*    expire date: 2016-04-06 00:00:00 GMT
*    issuer: C=US; O=Google Inc; CN=Google Internet Authority G2
*    SSL certificate verify ok.
* Server GFE/2.0 is not blacklisted
* Connection #0 to host www.google.com left intact
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.