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(終了)と入力するまで、インタラクティブセッションを開いたままにしますを押して 、またはまで EOF に遭遇しました。

-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を使用してコマンドラインからフェッチしました。 最後に、サーバー名表示が何に使用されるかを確認しました。