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


32

以下のような、コマンドラインのウェブサイトのダウンローダを使用してwgetcurlスクリプトで...または任意の他の1 ...

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

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

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

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

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

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


おそらく次のようなOpenSSLマジックを実行する必要があります。cyberciti.biz
Justin Andrusk

訪問者:これはinfosec SEクロスポストされたことに注意してください。そこから自己回答の1つがコピーされました。これは眉をひそめた行動です。
フェリックスサパレリ14

回答:


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

tcshの場合:

echo | openssl s_client -connect host.example.com:443 |& openssl x509 -fingerprint -noout

3
作品はzsh、あまりにもbashのために働く必要があります
number5

10

これでも十分です:

openssl x509 -fingerprint -in server.crt

-md5MD5フィンガープリントを取得するオプションを追加します。-md5間に入れてはならない-inserver.crt
林果皞

4

これは、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"]; それから 出口0 他に 1番出口 fi

TOCTOUに対して脆弱です。[1] MITMは、opensslクライアントリクエストに対して有効なフィンガープリントを返し、次のwgetリクエストを改ざんする可能性があります。[1] en.wikipedia.org/wiki/Time_of_check_to_time_of_use
ジェームズミッチ

理論的には本当です。wgetOpenSSLを使用して修正およびコンパイルするのはかなり簡単です。したがって、インラインで必要な処理を実行できますが、それはAUの回答の範囲を超えています。
っぽい

では、s_clientを使用してドキュメントも取得するのはどうでしょうか。(echo -ne "Host: ${HOST}\n\rGET ${URL}\n\r" && yes) 2>/dev/null | openssl s_client -connect ${HOST}:443うまくいくはずですよね さて、実際のコンテンツ応答からSSLセッション情報を分割する必要があります。
taneli

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 }'

出力:

* 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.