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

Для переключения звука микрофона по умолчанию в pulseaudio:

Убедитесь, что у вас есть pacmd (из пакета pulseaudio-utils) и notify-send (от libnotify-bin). Используйте этот скрипт:
#!/bin/sh

pacmd list-sources | awk '\
BEGIN {default_found=0;}

/^[\t ]*\*/ {default_found=1;}

/^[\t ]*name:/ {
    if (default_found) {
        name=$2;
        gsub("[<>]", "", name);
    }
}

/^[\t ]*muted:/ {
    if (default_found) {
        if ($2=="yes") {
            mute=0;
            icon="microphone-sensitivity-medium";
            status="unmuted"
        } else {
            mute=1;
            icon="microphone-sensitivity-muted";
            status="muted"
        }
        system("pacmd set-source-mute " name " " mute);
        system("notify-send --expire-time 1000 --icon " icon " Microphone: " status);
        exit;
    }
}

/^[\t ]*index:/{if (default_found) exit;}'
1
задан 14 September 2012 в 17:20

5 ответов

В tcsh:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout
9
ответ дан 25 May 2018 в 09:37

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

openssl x509 -fingerprint -in server.crt
8
ответ дан 25 May 2018 в 09:37

Это довольно легко сделать с командой 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
3
ответ дан 25 May 2018 в 09:37
  • 1
    Он уязвим для TOCTOU. [1] MITM может позволить вернуть действительный отпечаток пальца для запроса клиента openssl и вмешаться в следующий запрос wget. [1] ru.wikipedia.org/wiki/Time_of_check_to_time_of_use – James Mitch 14 September 2012 в 16:30
  • 2
    Правда, теоретически. Было бы довольно легко изменить wget и скомпилировать его с помощью OpenSSL, чтобы он выполнял то, что вы хотите встроить, но это выходит за рамки ответа AU. – ish 14 September 2012 в 17:19
  • 3
    Итак, как насчет использования s_client для извлечения документа? Что-то вроде (echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443 должно работать, нет? Ну, вы должны разделить информацию о сеансе SSL из фактического ответа на контент. – taneli 17 September 2012 в 16:10

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

3
ответ дан 25 May 2018 в 09:37

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

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
1
ответ дан 25 May 2018 в 09:37

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

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