リモートサーバーのSSL証明書をファイルとしてローカルに保存する方法


319

リモートサーバーのSSL証明書をダウンロードする必要があります(HTTPSではなく、SSLハンドシェイクはGoogle Chrome / IE / wgetおよびcurlと同じである必要があり、証明書チェック失敗エラーが発生します) IT担当者にCA証明書を提供することができないため、証明書ストア。

これはオフィスの通信用であるため、実際のクライアントを使用して証明書を取得することはできません。

これを行うには、Windows 7とLinuxの山が便利なので、ツール/スクリプト言語は問題ありません。


メールサーバーの証明書を取得するには、security.stackexchange.com
そのブラジル人の男

ほとんどの場合、ブラウザにはこの機能が組み込まれています。「開発ツール」の下にある可能性があります。
nobar

回答:


316

OpenSSLにアクセスできる場合は、試してください

openssl s_client -connect {HOSTNAME}:{PORT} -showcerts

{HOSTNAME}と{PORT}をあなたの値に置き換えます。


2
GUIを開く必要がないので、このオプションの方が好きです。サーバーからSSHで開くことができます。
ブランプ

2
さらに、HTTP以外のプロトコルでも機能します。
マット

14
elec3647のソリューションは、シェルパイプラインでのPEMの抽出を完全に自動化します。
phs

4
443はHTTPSのデフォルトポートです。
Flimm

4
-servername仮想ホスト証明書を取得するオプションが必要でした。gist.github.com/Artistan/5219484efb2fe51cd064175b3d0d5971
アーティストタン

240

証明書を取得してダウンロードする簡単な方法は、-showcertsからの出力をx509 sslコマンドにパイプする次のコマンドを実行し、余分なものをすべて削除することです。例えば:

openssl s_client -showcerts -connect server.edu:443 </dev/null 2>/dev/null|openssl x509 -outform PEM >mycertfile.pem

wgetで証明書を使用するには、

wget https:/server.edu:443/somepage --ca-certificate=mycertfile.pem

5
私はこれを(別のウェブサイトで)試しましたが、証明書の完全なチェーンが期待されていました:これはチェーンの最初のものだけを取り戻したようです-それは期待されることですか?
モノジョニー14

8
それは私のために働いていません:証明書をロードできません27262:error:0906D06C:PEM routines:PEM_read_bio:no start line:/SourceCache/OpenSSL098/OpenSSL098-50/src/crypto/pem/pem_lib.c:648:Expecting:TRUSTED証明書
Janusz 14

4
monojohnnyに同意しますが、これは完全な連鎖をあなたに与えません。
マイケルマンジー14

4
遅くても@monojohnny:openssl s_client -showcerts受信したチェーン内のすべての証明書を表示します(接続が成功した場合)が、パイピングスルーopenssl x509は最初の証明書のみを取り、残りは破棄します。それらのすべてを代わりに使用するには、...| sed -n '/^-----BEGIN CERT/,/^-----END CERT/p'またはを...| awk '/^-----BEGIN CERT/,/^-----END CERT/'使用して、awk各証明書を別のファイルに入れて少し使いやすくすることもできopensslます。
-dave_thompson_085

3
wgetを使用すると、index.html=>HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html.1’
OZZIE

126

正直に言うと、私はこれを試したことは一度もありません(必要ではありませんでした)が、Firefoxで試したことがあり、保存にはうまくいくようです:

  1. 上部のSSL証明書アイコン/下部の南京錠をクリックします。
  2. クリック View Certificate
  3. Detailsタブをクリックします
  4. 階層から必要な証明書を選択します[図の丸で囲まれていない]
  5. クリック Export

代替テキスト


知っておきたいことですが、私の好奇心のために、達成しようとしていることをもう少し説明できますか?あなたが実際にそれを行う必要がありますなぜ私は... SSLクライアント証明書をエクスポートする必要はありませんし、非常に興味がありますことがない
ウィリアムHilsumを

1
これはサーバー証明書であり、クライアント証明書ではありません。クライアントの秘密鍵と証明書をエクスポートする主な理由は、バックアップを維持するため、または別のブラウザーまたはコンピューターを使用して認証する場合です。
gbroiles

@gbroiles-質問を読んで、彼は間違った用語を使用しましたが、これは彼の問題を解決しました。
ウィリアムヒルサム

1
あなたの質問に答えました-なぜ誰かがクライアント証明書を保存したいのですか?「SSLクライアント証明書」はあなたの用語であり、彼の用語ではありません。
-gbroiles

1
Chromeでこれを行う方法はないようですね。
ファツホク

50

Chromeブラウザーを使用して証明書をエクスポートする

  1. SSLを使用してWebサイトに接続しますhttps:// whatever

2.ロック記号をクリックしてから、詳細をクリックします

  1. Chromeバージョン56以降、次の操作を行います。3つのドットメニュー-> [その他のツール]-> [開発者ツール]に移動し、[セキュリティ]タブをクリックします。これにより、[証明書の表示]ボタンを含むセキュリティの概要表示されます。

  2. [ 証明書の表示]ボタンをクリックします。

    モーダルウィンドウが開きます。2つのペインがあります。最上部には、サイトの証明書(最後にリストされているもの)、中間証明書、およびルート証明書(最上部のもの)の信頼階層が表示されています。

    2番目の大きなペインには、いずれかの証明書の詳細が表示されます。

    ゼロ以上の中間証明書が存在する場合があります。

    ルート証明書には金枠のアイコンが付いていることに注意してください。他のものは青い境界線があります。

    以下のスクリーンショットをご覧ください。

  3. 証明書をエクスポートするには:

    1. 最初に、信頼階層で証明書のアイコンをクリックします。
    2. 証明書は、モーダルのメイン部分に表示されます。
    3. モーダルのメイン部分にある証明書の大きなアイコンをクリックします。アイコンをデスクトップにドラッグします。その後、Chromeは証明書をデスクトップにコピーします。

ここに画像の説明を入力してください


1
アイコンをテキストエディターにドラッグする必要がありましたが、デスクトップは機能しませんでした。
コリークライン

2
Windows上のChromeの場合、[証明書の表示]をクリックすると、モーダルはMacと異なります。[詳細]タブをクリックし、[ファイルにコピー...]をクリックして、形式とファイル名を選択します。
PolyTekPatrick

1
Mac OSでChrome v63を使用する場合、証明書をドラッグして取得したテキストファイルは人間が読める形式ですが、X.509 .crtなどの機械可読形式に変換する方法を理解できる構造化形式ではありません。
ジムデラハント

アドレスバーまたはこのdevタブから開く場合、違いはありませんが、まだcrtをダウンロードできません
...-user25

1
Chrome 72.0.3626.121で動作しなくなった
A. D'Alfonso

20

これはgbroilesの答えですが、cURLプロジェクトにopenssl、リモートサーバーのSSL証明書を保存するための使用に関するいくつかの詳細含むページがあることを指摘したかったのです。

  • openssl s_client -connect {HOSTNAME}:{PORT} | ティーログファイル
  • タイプQUITし、Enter / Returnキーを押してください。
  • 証明書は、「BEGIN CERTIFICATE」マーカーと「END CERTIFICATE」マーカーの間にリストされます。
  • 証明書のデータを表示する場合は、次を使用できます。

    openssl x509 -inform PEM -in certfile -text -out certdata

    どこcertfileから抽出された証明書がありますlogfile。を見てくださいcertdata


これは私のために働いた。もう少し明確にするために、ログファイルを編集し、BEGIN CERTIFICATEおよびEND CERTIFICATEの外にあるすべてのものをトリミングし、結果をcertfile.pemとして保存しました(拡張子が必要かどうかわかりません)。
マイケルウェルチ

16

自動化

-servernameは、サーバー上の仮想ホストから正しい証明書を取得するために必要でした。

openssl s_client -showcerts -connect host.name.com:443 -servername host.name.com </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > host.name.com.pem

デスクトップ用の証明書に変換することもできます

openssl x509 -inform PEM -in host.name.com.pem -outform DER -out host.name.com.cer

最後の部分は、証明書に追加すること
です、私が使用したMacキーチェーンのWindowsではわかりませんが、似ているはずです...

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain host.name.com.cer



一部のアプリケーションは、システムとSYSTEMROOTキーホルダーとのトラブル(Golangが、私はあなたを見ています)を持っているので、それらのレベルの信頼をインストールして設定した後、あなたはまた、独自のユーザーのにそれをコピーすることに注意してくださいlogin.keychain経由してKeychain Access、あなたは、アプリSystem / SystemRootの証明書を参照し、クリックしてloginキーチェーンにドラッグするだけです。
dragon788

1
@ dragon788-私の意図はコマンドラインでこれを自動化することであり、これは私のために動作します。CLI経由でlogin.keychainのソリューションを見つけた場合は、ここで共有してください!ありがとう!
アルティスタン

私がウェブで読んだものから判断すると-d、コマンドからfromを省略するだけで、システムキーチェーンではなくユーザーキーチェーンにのみ適用されると信じています。
dragon788

中間証明書も追加する場合trustAsRoottrustRoot、正しく追加するために代わりに使用する必要があります。
dragon788

2

これにより、証明書のみを含む結果が得られます

echo QUIT | \
openssl s_client -showcerts -connect hostname:port | \
awk '/-----BEGIN CERTIFICATE-----/ {p=1}; p; /-----END CERTIFICATE-----/ {p=0}' "

0

Windowsの場合、はるかに簡単な方法が見つかりました。Microsoft Edge(pre-chromium)を試し、アドレスバーのロックをクリック-> [証明書の表示]ダイアログがポップアップし、[ファイルにエクスポート]ボタンが表示され、.crtファイルとして保存されます。

Edgeはあまり使いませんが、これは簡単なことです。

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