web-dev-qa-db-ja.com

WebサイトからSSL証明書をダウンロードする方法

Wgetまたは他のコマンドを使用して、たとえば https://www.google.com からssl証明書をダウンロードしたい。 UNIXコマンドラインはありますか? wgetまたはopenssl?

192
RainDoctor

答えを見つけました。 opensslが提供します。

openssl s_client -connect $ {REMHOST}:$ {REMPORT}

59
RainDoctor

証明書をダウンロードするには、opensslに組み込まれているクライアントを次のように使用する必要があります。

echo -n | openssl s_client -connect Host:PORTNUMBER \
    | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert

これにより、証明書が/tmp/$SERVERNAME.certに保存されます。

チェーン内のすべての証明書をダウンロードする場合は、-showcertsを使用できます。ただし、サーバー証明書をダウンロードするだけの場合は、-showcertsを指定する必要はありません。

echo -nはサーバーに応答を返すため、接続が解放されます

sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'は、証明書チェーンと接続の詳細に関する情報を削除します。これは、証明書を他のキーストアにインポートするための推奨フォーマットです。

258

[〜#〜] gnutls [〜#〜] クライアントツール、gnutls-cli、これも簡単にできます:

gnutls-cli --print-cert www.example.com \
        < /dev/null \
        > www.example.com.certs

プログラムはサイトにインタラクティブなクライアントを提供するように設計されているため、空の入力(この例では/dev/null)インタラクティブセッションを終了します。

23
bignose
true | openssl s_client -connect google.com:443 2>/dev/null | openssl x509

opensslのこのモードはstdinを想定しているため、true |を介して提供します。これは、-connectパラメーターで指定されたサーバーに接続します。 2>/dev/nullはエラーを抑制します(オプション)。出力全体をx509パーサーに渡し、/dev/stdinを指定してシェルパイプを入力ファイルとして使用できます。そして、それは-----BEGIN CERTIFICATE-----出力の-----END CERTIFICATE-----からs_clientの部分だけを出力します。コマンドの最後に> google.com.pemを追加することで、ファイルにリダイレクトできます。


私が知る限り、これは証明書チェーンを検証せず、エンドサーバーが提供するssl IDのみを通知します。

9
ThorSummoner

@bignoseの回答に基づいて、ここに自己完結型バージョンがあります。シェフのレシピ:

Sudo apt-get install gnutls-bin 
gnutls-cli --print-cert myserver.com </dev/null| sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > myserver.crt
Sudo cp myserver.crt /usr/local/share/ca-certificates/myserver.crt
Sudo update-ca-certificates
9
oDDsKooL

Exとプロセス置換を使用した代替構文:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt
0
kenorb