Как проверить SSL-отпечаток с помощью командной строки? (Wget, Curl, ...)

32

Использование загрузчика веб-сайта из командной строки, например 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.

Джеймс Митч
источник
Вероятно, нужно сделать что-нибудь магическое в OpenSSL, например: cyberciti.biz/faq/…
Джастин Андруск
Посетители: обратите внимание, что это была перекрестная публикация на Infosec SE . Один из ответов на вопросы был скопирован оттуда. Это хмурое поведение, кстати.
Феликс Сапарелли

Ответы:

31

Источник

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

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 с помощью torproject.org FAQ: 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
Джеймс Митч
источник
это не работает при наличии прокси, однако: - /
Фредерик Норд
Обратите внимание, что опция -CAfile в вашем примере полностью игнорируется.
Ларс
11

В тсш:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout
user273818
источник
3
работает zsh, должны работать на Баш тоже
number5
10

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

openssl x509 -fingerprint -in server.crt
rundekugel
источник
Добавить -md5опцию для получения отпечатка пальца MD5. -md5не должен ставить между -inи server.crt.
皞 皞
4

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

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

#! / Bin / Баш
FPRINT = `echo -n | openssl s_client -connect $ 1: 443 2> / dev / null \ | openssl x509 -noout -fingerprint | cut -f2 -d '=' ` if ["$ 2" = "$ FPRINT"]; тогда выход 0 еще выход 1 фи
иш
источник
Это уязвимо для ТОКУ. [1] MITM может позволить вернуть действительный отпечаток для запроса клиента openssl и подделать следующий запрос wget. [1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
Джеймс Митч,
Правда в теории. Было бы довольно легко изменить wgetи скомпилировать его с помощью OpenSSL, чтобы он выполнял то, что вы хотите встроенным, но это выходит за рамки AU-ответа.
иш
Итак, как насчет использования s_client для получения документа? Что-то вроде (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443должно работать, нет? Что ж, вы должны отделить информацию о сеансе SSL от фактического содержимого ответа.
Танели
3

источник

#!/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), это нормально.

Джеймс Митч
источник
1

Это мой повседневный сценарий:

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
Антонио Фейтоса
источник