Использование отпечатка пальца, вероятно, самый простой способ проверить самозаверяющий сертификат, который находится под вашим собственным контролем.При использовании SSL_fingerprint
он не будет заботиться о каких-либо других видах проверок, т. Е. Больше не будет проверять имя, отзыв, истечение срока действия и т. Д., Поэтому, если вы хотите иметь проверки для этого, вам не следует использовать SSL_fingerprint
.
Получение отпечатка пальца сайта можно выполнить, подключившись к сайту один раз без проверки (так как вы еще не доверяете сертификату) и получив отпечаток пальца или получив отпечаток пальца непосредственно из сертификата.
Чтобы получить отпечаток пальца, запрашивая сервер, предполагая, что соединение не перехватывается, чтобы вы получили правильный отпечаток пальца:
use IO::Socket::SSL;
print IO::Socket::SSL->new(
PeerHost => 'example.com:443',
# switch off validation since the certificate is not trusted yet
SSL_verify_mode => SSL_VERIFY_NONE,
)->get_fingerprint,"\n";
В настоящее время это дает sha256$642de54d84c30494157f53f657bf9f89b4ea6c8b16351fd7ec258d556f821040
, который можно напрямую использовать в качестве аргумента для SSL_fingerprint
.
Если у вас уже есть сертификат для сайта, вы можете вычислить отпечаток непосредственно на нем:
# get the certificate
$ openssl s_client -connect example.com:443 -servername example.com
...
-----BEGIN CERTIFICATE-----
MIIF8jCCBNqgAwIBAgIQDmTF+8I2reFLFyrrQceMsDANBgkqhkiG9w0BAQsFADBw
...
-----END CERTIFICATE-----
# take this PEM certificate and get fingerprint
$ openssl x509 -fingerprint -sha256 -noout -in cert.pem
SHA256 Fingerprint=64:2D:E5:4D:84:C3:04:94:15:7F:53:F6:57:BF:9F:89:B4:EA:6C:8B:16:35:1F:D7:EC:25:8D:55:6F:82:10:40
Показанный отпечаток практически такой же, как и раньше, только написанный на другомпуть.Удаляя все ':' (которые есть только для удобства чтения), вы получаете 642DE5....1040
, а с префиксом к используемому алгоритму хеширования sha256
вы получаете что-то, что можно использовать в SSL_fingerprint
: sha256$642DE5...1040
.
Чтобы использовать отпечаток пальца, а затем подключиться к сайту:
my $cl = IO::Socket::SSL->new(
PeerHost => 'example.com:443',
SSL_fingerprint => 'sha256$642DE5...1040'
);