web-dev-qa-db-ja.com

コマンドラインでSSLフィンガープリントを確認する方法は? (wget、curl、...)

wgetcurlなどのコマンドラインWebサイトダウンローダーを使用する...スクリプト内...

WebサイトのSHA-1およびSHA-256証明書を持っています。セキュリティ上の懸念のため( 1 )( 2 )、パブリックSSL認証局システムを使用したくありません。指紋はハードコーディングする必要があります。

アプリケーションのようなwgetはSSLフィンガープリントをチェックできますか?

wgetにはそのような機能はありません。 ()

wget --ca-certificateまたはcurl --cacertを使用すると、独自のローカル認証局を実行する必要があります。これは防止したいのです。また、それは非常に難しく、誰もそれをやったことがありません。 ( 4

次のようなツールはありませんか
download --tlsv1 --serial-number xx:yy:zz --fingerprint xxyyzz https://site.com

もちろん、ソリューションはTOCTOUに対して脆弱ではない必要があります。 ( 5 )MITMは、opensslクライアントリクエストの有効なフィンガープリントを返し、次のwgetリクエストを改ざんする可能性があります。

31
James Mitch

ソース

必要なソフトウェアをインストールします。

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

torproject.org FAQ:SSL とSHA-1およびSHA-256フィンガープリントを手動で比較します。

.

オプションで、CA証明書をテスト目的で使用できないようにします。ここではcurlを使用していますが、wgetにはバグがあります バグ そして、とにかくcaファイルを使用します。

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

Curlとピン留めされた証明書を使用してダウンロードします。

curl --cacert ./torproject.pem https://check.torproject.org/ > check.html
30
James Mitch

Tcshの場合:

echo | openssl s_client -connect Host.example.com:443 |& openssl x509 -fingerprint -noout
11
user273818

これでも十分です:

openssl x509 -fingerprint -in server.crt
10
rundekugel

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
4
ish

ソース

#!/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
James Mitch

それが私の日常のスクリプトです:

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
Antonio Feitosa