サーバーからSSL証明書を取得する
1. 概要
HTTPS接続をデバッグする場合、サーバー証明書を取得する必要があることがよくあります。 この証明書はSSLハンドシェイクが発生したときに送信されるため、取得する方法は複数あります。
このクイックチュートリアルでは、WebブラウザまたはOpenSSLコマンドラインユーティリティを使用してサーバー証明書を取得する方法を説明します。
2. Webブラウザの使用
証明書を取得する最も簡単な方法は、Webブラウザーを使用することです。 Firefoxでこれを行う方法を見てみましょう。
まず、アドレスバーのサイト情報(ロック記号)をクリックしてみましょう。
次に、接続の詳細メニューで、詳細情報をクリックします。
それでは、証明書の表示をクリックしてみましょう。
この後、新しいタブが開きます。
ここで、[ダウンロード]フィールドのリンクをクリックすると、[その他]セクションからPEM形式で証明書を保存できます。
2番目のリンクから完全な証明書チェーンを取得することもできます。
3. OpenSSLの使用
ブラウザにアクセスできない場合は、コマンドラインから証明書を取得することもできます。
openssl s_clientコマンドを使用して、サーバーへのインタラクティブなSSL接続を取得できます。
$ openssl s_client -connect baeldung.com:443
CONNECTED(00000003)
# some debugging output
-----BEGIN CERTIFICATE-----
MIIE6DCCBI2gAwIBAgIQDJkqrAVVvIBWJvIMDkzpwzAKBggqhkjOPQQDAjBvMQsw
CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
GTAXBgNVBAoTEENsb3VkRmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkRmxhcmUg
SW5jIEVDQyBDQS0yMB4XDTIwMDEzMTAwMDAwMFoXDTIwMTAwOTEyMDAwMFowbTEL
# certificate output trimmed
-----END CERTIFICATE-----
# some more output
Q
これ Q(終了)と入力するまで、インタラクティブセッションを開いたままにしますを押して
-showcertsオプションを使用して、完全な証明書チェーンを取得できます:
$ openssl s_client -showcerts -connect baeldung.com:443
CONNECTED(00000003)
# some debugging output
-----BEGIN CERTIFICATE-----
MIIE6DCCBI2gAwIBAgIQDJkqrAVVvIBWJvIMDkzpwzAKBggqhkjOPQQDAjBvMQsw
CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
GTAXBgNVBAoTEENsb3VkRmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkRmxhcmUg
SW5jIEVDQyBDQS0yMB4XDTIwMDEzMTAwMDAwMFoXDTIwMTAwOTEyMDAwMFowbTEL
# certificate output trimmed
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDozCCAougAwIBAgIQD/PmFjmqPRoSZfQfizTltjANBgkqhkiG9w0BAQsFADBa
MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl
clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE1
MTAxNDEyMDAwMFoXDTIwMTAwOTEyMDAwMFowbzELMAkGA1UEBhMCVVMxCzAJBgNV
# certificate output trimmed
-----END CERTIFICATE-----
# some more output
これらの出力をコピーしてファイルに貼り付け、さらに処理を行うことができます。 ただし、Linuxの魔法を使って、出力全体から証明書のみを抽出しましょう:
$ openssl s_client -showcerts -connect baeldung.com:443 </dev/null | sed -n -e '/-.BEGIN/,/-.END/ p' > certifs.pem
certifs.pemファイルを見てみましょう。
$ cat certifs.pem
-----BEGIN CERTIFICATE-----
MIIE6DCCBI2gAwIBAgIQDJkqrAVVvIBWJvIMDkzpwzAKBggqhkjOPQQDAjBvMQsw
CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
GTAXBgNVBAoTEENsb3VkRmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkRmxhcmUg
SW5jIEVDQyBDQS0yMB4XDTIwMDEzMTAwMDAwMFoXDTIwMTAwOTEyMDAwMFowbTEL
# certificate output trimmed
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDozCCAougAwIBAgIQD/PmFjmqPRoSZfQfizTltjANBgkqhkiG9w0BAQsFADBa
MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl
clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE1
MTAxNDEyMDAwMFoXDTIwMTAwOTEyMDAwMFowbzELMAkGA1UEBhMCVVMxCzAJBgNV
# certificate output trimmed
-----END CERTIFICATE-----
コマンドを分解してみましょう:
- まず、 openssl s_clientコマンドを呼び出し、nullデバイス(/ dev / null)を標準入力にリダイレクトします
- その結果、 EOF を読み取るため、インタラクティブセッションは終了します。
- 最後に、 sedを使用して出力をフィルタリングし、証明書をファイルにダンプします
3.1. リバースプロキシの背後にあるサーバー
状況によっては、サーバーが負荷分散の目的でリバースプロキシの背後に配置される場合があります。
まず、nslookupを使用してホストIPを見つけましょう。
$ nslookup baeldung.com
Server: 192.168.0.1
Address: 192.168.0.1#53
Non-authoritative answer:
Name: baeldung.com
Address: 172.64.104.34
# some more output
前の例を実行してみましょうが、代わりにホストIPアドレスを使用します。
$ openssl s_client -showcerts -connect 172.64.104.34:443
CONNECTED(00000003)
140695394247936:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake
failure:ssl/record/rec_layer_s3.c:1543:SSL alert number 40
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 293 bytes
# some more output
エラーが発生します。 リバースプロキシ( 172.64.104.34 アドレスで識別)は、私たち自身を含む複数のWebサーバーにサービスを提供します。
その結果、サーバー名を送信して、返される証明書を認識できるようにする必要があります。 このメカニズムはサーバー名表示と呼ばれます。
しかし、なぜ最初の例がこのオプションなしで機能したのでしょうか。 デフォルトでは、OpenSSLはconnectに渡されたのと同じ値をサーバー名に入力します。
baeldung.com を渡して、何が起こるか見てみましょう。
$ openssl s_client -servername baeldung.com -showcerts -connect 172.64.104.34:443
CONNECTED(00000003)
# some debugging output
-----BEGIN CERTIFICATE-----
MIIE6DCCBI2gAwIBAgIQDJkqrAVVvIBWJvIMDkzpwzAKBggqhkjOPQQDAjBvMQsw
CQYDVQQGEwJVUzELMAkGA1UECBMCQ0ExFjAUBgNVBAcTDVNhbiBGcmFuY2lzY28x
GTAXBgNVBAoTEENsb3VkRmxhcmUsIEluYy4xIDAeBgNVBAMTF0Nsb3VkRmxhcmUg
SW5jIEVDQyBDQS0yMB4XDTIwMDEzMTAwMDAwMFoXDTIwMTAwOTEyMDAwMFowbTEL
# certificate output trimmed
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIDozCCAougAwIBAgIQD/PmFjmqPRoSZfQfizTltjANBgkqhkiG9w0BAQsFADBa
MQswCQYDVQQGEwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJl
clRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTE1
MTAxNDEyMDAwMFoXDTIwMTAwOTEyMDAwMFowbzELMAkGA1UEBhMCVVMxCzAJBgNV
# certificate output trimmed
-----END CERTIFICATE-----
# some more output
Q
これで、以前と同じ結果が得られます。
4. 結論
このクイックチュートリアルでは、SSLサーバー証明書を取得する方法を説明しました。
最初の部分では、Webブラウザーでそれを行う方法を見ました。 次に、OpenSSLを使用してコマンドラインからフェッチしました。 最後に、サーバー名表示が何に使用されるかを確認しました。