wget
、curl
などのコマンドライン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リクエストを改ざんする可能性があります。
必要なソフトウェアをインストールします。
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
Tcshの場合:
echo | openssl s_client -connect Host.example.com:443 |& openssl x509 -fingerprint -noout
これでも十分です:
openssl x509 -fingerprint -in server.crt
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からのように聞こえます)、これで問題ありません。
それが私の日常のスクリプトです:
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