Использование загрузчика веб-сайта из командной строки, например 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
и ее клиентской функциональности.
Следующий небольшой скрипт возьмет данный домен (без префикса 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
#!/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), это нормально.
Установите необходимое программное обеспечение:
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
Этого также достаточно:
openssl x509 -fingerprint -in server.crt
В ЦТШ:
echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout
Это мой ежедневный скрипт:
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