SSL parmak izi komut satırı ile nasıl doğrulanır? (wget, curl,…)


32

Bir komut satırı web sitesi indiricisi wget, curlya da başka bir komut dosyası kullanarak ...

Bir web sitesinin SHA-1 ve SHA-256 onaylı parmak izine sahibim. Güvenlik endişeleri nedeniyle ( 1 ) ( 2 ), genel SSL sertifika yetkilisi sistemini kullanmak istemiyorum. Parmak izi zor kodlanmış olmalıdır.

Bir wget benzeri uygulama SSL parmak izini kontrol edebilir mi?

wget'ın böyle bir işlevi yoktur. ( 3 )

Kullanmak wget --ca-certificateveya curl --cacertönlemek istediğim kendi yerel sertifika otoritemi çalıştırmak zorunda kalacağım, çünkü bu çok fazla karmaşıklık sağlıyor. Aynı zamanda çok zor ve bunu daha önce kimse yapmadı. ( 4 )

Gibi herhangi bir araç yok
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.commu?

Çözüm elbette TOCTOU'ya karşı savunmasız olmamalıdır. ( 5 ) MITM openssl istemcisi talebi için geçerli bir parmak izi döndürür ve aşağıdaki wget isteğini değiştirir.


Muhtemelen bazı OpenSSL sihirlerini yapmanız gerekir: cyberciti.biz/faq/…
Justin Andrusk

Ziyaretçiler: Bunun, infosec SE'ye çapraz olarak gönderildiğini unutmayın . Kendinden cevaplardan biri oradan kopyalandı. Bu kaşlarını çattı, davranış, btw.
Félix Saparelli

Yanıtlar:


31

Kaynak

Gerekli yazılımı yükleyin:

apt-get install ca-certificates curl

Genel SSL sertifikasını indirin:

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

Ya da daha iyisi:

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

SHA-1 parmak izini alın:

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

SHA-256 parmak izini alın:

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

SHA-1 ve SHA-256 parmak izlerini torproject.org FAQ ile manuel olarak karşılaştırın .

.

İsteğe bağlı olarak test sertifikaları için ca-sertifikaları işe yaramaz hale getirir. Burada kıvrılma kullanmak , ancak wget'in bir Bug Bug'ı var ve yine de ca-files kullanıyor.

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

Curl ve sabitlenmiş sertifika ile indirin:

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

bu olsa da, bir vekil varlığında çalışmıyor: - /
Frederick Nord

Lütfen örneğinizde -CAfile seçeneğinin tamamen yok sayıldığını unutmayın.
Lars,

11

Tcsh içinde:

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

3
çalışır zsh, bash için de çalışmalıdır
sayı 5

10

Bu da yeter:

openssl x509 -fingerprint -in server.crt

-md5MD5 Parmak İzi almak için seçenek ekleyin . -md5ve arasına -ingirmemelidir server.crt.
皞 皞

4

Bu opensslkomut ve müşteri işlevselliği ile yapmak oldukça kolaydır .

Aşağıdaki küçük komut dosyası belirli bir etki alanını (https öneki yok) ve bir SHA-1 parmak izini alır ve alınan parmak izi eşleşirse hata olmadan (0) çıkar, ancak eşleşme yoksa çıkış kodu 1 ile çıkar. Daha sonra sadece son çıkış kodu test ederek Senaryonuzun dahil edebilirsiniz $?:

#! / Bin / bash
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -çoğu-parmak izi | cut -f2 -d '=' ` eğer ["$ 2" = "$ FPRINT"]; sonra Çıkış 0 Başka çıkış 1 fi

TOCTOU'ya karşı savunmasızdır. [1] MITM openssl istemcisi isteği için geçerli bir parmak izi döndürmeye ve aşağıdaki wget isteğini değiştirmeye izin verebilir. [1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
James Mitch

Doğru, teoride. wgetOpenSSL ile değiştirmek ve derlemek, satır içi istediğinizi gerçekleştirmek için oldukça kolay olurdu , ancak bu bir AU cevabının kapsamı dışındadır.
imsi

Peki belgeyi almak için s_client kullanmaya ne dersiniz? Gibi bir şey (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443çalışması gerekir, hayır? Peki, SSL oturum bilgilerini gerçek içerik yanıtından ayırmanız gerekir.
taneli

3

kaynak

#!/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;
}

Net :: SSLeay belgelerinde belirtildiği gibi, bu yöntem HTTP işleminden sonra doğrulama anlamına gelir ve bu nedenle, verileri göndermeden önce doğru sunucuyla konuştuğunuzu doğrulamak istiyorsanız kullanılmamalıdır. Ancak yaptığınız tek şey, az önce indirdiğinize güvenip güvenmeyeceğinize karar vermekse (ki bu sizin # 4 referansınızdan geliyor gibi) bu iyi.


1

Bu benim günlük senaryom:

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

Çıkışı:

* 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.