Как проверить SSL-отпечаток с помощью командной строки? (wget, curl, & hellip;)

Использование загрузчика веб-сайта из командной строки, например wget, curl или любого другого ... В сценарии ...

У меня есть отпечаток пальца SHA-1 и SHA-256 на веб-сайте. Из-за проблем безопасности ( 1 ) ( 2 ) я не хочу использовать общедоступную систему центра сертификации SSL. Отпечаток пальца должен быть жестко закодирован.

Может ли приложение, похожее на wget, проверять отпечаток SSL?

wget не имеет такой функциональности. ( 3 )

Используя wget --ca-certificate или curl --cacert, мне пришлось бы запускать свой собственный локальный центр сертификации, что я хотел бы предотвратить, потому что это добавляет много сложности. Это также очень сложно, и никто никогда не делал этого раньше. ( 4 )

Нет ли какого-либо инструмента, например
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com?

Решение, конечно, не должно быть уязвимым для TOCTOU. ( 5 ) MITM может позволить вернуть действительный отпечаток для запроса клиента openssl и подделать следующий запрос wget.

32
задан 14 September 2012 в 16:20

6 ответов

Это довольно легко сделать с помощью команды openssl и ее клиентской функциональности.

Следующий небольшой скрипт возьмет данный домен (без префикса https) и отпечаток SHA-1 и завершится без ошибки (0), если найденный отпечаток совпадает, но с кодом выхода 1, если совпадения нет. Затем вы можете включить его в свой скрипт, просто протестировав последний код выхода $?:

#!/bin/bash
FPRINT=`echo -n | openssl s_client -connect $1:443 2>/dev/null \| openssl x509 -noout -fingerprint | cut -f2 -d'='` if [ "$2" = "$FPRINT" ]; then exit 0 else exit 1 fi
0
ответ дан 14 September 2012 в 16:20

source

#!/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, этот метод означает проверку после транзакции HTTP и поэтому не должен использоваться, если вы хотите проверить вы говорите с нужным сервером перед отправкой им данных. Но если все, что вы делаете, это решаете, доверять или не доверять тому, что вы только что загрузили (что звучит так, как будто вы по вашей ссылке # 4), это нормально.

0
ответ дан 14 September 2012 в 16:20

Источник

Установите необходимое программное обеспечение:

apt-get install ca-certificates curl

Загрузите общедоступный сертификат SSL:

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

Или лучше:

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:

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

Получить отпечаток SHA-256:

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

Вручную сравнить отпечатки пальцев SHA-1 и SHA-256 с FAQ по torproject.org: SSL .

.

Опционально делают CA-сертификаты бесполезными для целей тестирования. Здесь используется curl , но wget содержит ошибку Bug и в любом случае использует ca-файлы.

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

Скачать с curl и прикрепленным сертификатом:

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html
0
ответ дан 14 September 2012 в 16:20

Этого также достаточно:

openssl x509 -fingerprint -in server.crt
0
ответ дан 14 September 2012 в 16:20

В ЦТШ:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout
0
ответ дан 14 September 2012 в 16:20

Это мой ежедневный скрипт:

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

Вывод:

* 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
0
ответ дан 14 September 2012 в 16:20

Другие вопросы по тегам:

Похожие вопросы: