証明書に関する問題のトラブルシューティング

アプリケーションで特定の場所から得た証明書の信頼が拒否された場合は、CA チェーン内のいずれかの署名者、または元の CA ルートが信頼されていない可能性があります。問題を特定するには、サーバーの証明書チェーン (サーバーの信頼チェーン内の独自の ID 証明書から元の CA ルートに至るまで) を取得する必要があります。

特定のサーバーの証明書チェーンを取得するには、OpenSSL の s_client 関数を使用します。この関数は、SSL/TLS を使用するリモート サーバーに透過的に接続できる汎用 SSL/TLS クライアントを実装します。これはテスト使用のみを目的としており、基本的なインターフェイス機能しか提供しませんが、OpenSSL ssl ライブラリのほぼすべての機能を内部的に使用します。

次のように、サーバー上の SSL サービスに接続します。

openssl s_client -showcerts -connect <myserver>:<ssl_port> 

これにより、サーバー証明書からルート CA 証明書までのチェーン内のすべての証明書が返されます。これらの証明書はすべて PEM 形式です。このコマンドにより、サーバーとのセッションが開きます。証明書の要求に応答した後、セッションはさらに要求が送信されるのを待機します。Ctrl+Z を押してセッションを終了するか、サーバーで接続がタイムアウトするまで待つことができます。

次に例を示します。

openssl s_client -showcerts -connect ibank.myBank.co.uk:443

上記のコマンドは次を返します。

Loading 'screen' into random state - done
CONNECTED(00000790)
depth=2 /C=US
        /O=VeriSign, Inc.
        /OU=Class 3 Public Primary Certification Authority

verify error:num=19:self signed certificate in certificate chain
verify return:0

すべての証明書チェーンの CA ルート証明書が自己署名されているため、エラー 19 の状態が想定されます。詳細については、後述する「エラー 19 の詳細」を参照してください。

---
Certificate chain
 0 s:/C=GB/ST=Bucks/L=Chesham/O=myBank PLC
     /OU=Enable
     /OU=Terms of use at www.verisign.co.uk/rpa (c) 03
     /OU=Authenticated by VeriSign
     /OU=Member, VeriSign Trust Network
     /CN=ibank.myBank.co.uk
   i:/O=VeriSign Trust Network
     /OU=VeriSign, Inc.
     /OU=VeriSign International Server CA - Class 3
     /OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
-----BEGIN CERTIFICATE-----
MIIE3TCCBEagAwIBAgIQXM1dOQs/cV03UDAru58mEjANBgkqhkiG9w0BAQQFADCB
ujEfMB0GA1QBChMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazDJEEUGA1UECxMOVmVy
ONfYgdrkI7Bwhc58KJR4zqwppdl0QgsspXgmz7gJFgsgfZdptm/QvXfs+N4mxDm8
b0I6p9RtmLq82Itr6q1wUWssjHm5PlZRoQ8YaYJkaUN2rLsRT1SyQxygRo9xu81d
0Q==
-----END CERTIFICATE-----

これは、サーバー システムを識別する証明書の終わり「0」を示します。次のセクション「s:」は証明書の所有者 (「サブジェクト」) を示し、その次のセクション「i:」は発行者を示します。

 1 s:/O=VeriSign Trust Network
     /OU=VeriSign, Inc.
     /OU=VeriSign International Server CA - Class 3
     /OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
   i:/C=US
     /O=VeriSign, Inc.
     /OU=Class 3 Public Primary Certification Authority
-----BEGIN CERTIFICATE-----
MIIDgzCCAuygAwIBAgIQJUuKhThCzONY+MXdriJupDANBgkqhkiG9w0BAQUFADBf
MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT
1RPuKSvD5HKNRO3RrCAJLeH24RkFOLA9D59/+D3R3IYChmFOJl9en5IeDCSk9dBw
E88mw0M9SR2egi5SX7w+xmYpAY5Okiy8RnUDgqxz6dl+C2fvVFIa
-----END CERTIFICATE-----

サーバー システムの証明書の署名者を識別する証明書の終わり「1」に達しました。「s」セクションを見ると、この証明書には証明書「0」ほどの詳細は含まれていないが、署名者に正当な ID を与えるのに十分であることがわかります。この点を把握しておくことが重要です。実際に使用する証明書を作成する場合、作成者は、証明書コンテンツ内に十分な情報を含めて、証明書によって表される項目またはエンティティを正当に識別できるようにする必要があります。

 2 s:/C=US
     /O=VeriSign, Inc.
     /OU=Class 3 Public Primary Certification Authority
   i:/C=US
     /O=VeriSign, Inc.
     /OU=Class 3 Public Primary Certification Authority
-----BEGIN CERTIFICATE-----
MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
A1USXhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzlbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
-----END CERTIFICATE-----
---
Server certificate
subject=/C=GB/ST=Bucks/L=Chesham/O=myBank PLC
        /OU=Enable
        /OU=Terms of use at www.verisign.co.uk/rpa (c) 03
        /OU=Authenticated by VeriSign/OU=Member, VeriSign Trust Network
        /CN=ibank.myBank.co.uk
issuer=/O=VeriSign Trust Network
       /OU=VeriSign, Inc.
       /OU=VeriSign International Server CA - Class 3
       /OU=www.verisign.com/CPS Incorp.by Ref. LIABILITY LTD.(c)97 VeriSign
---
No client certificate CA names sent
---
SSL handshake has read 2894 bytes and written 352 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
SSL-Session:
    Protocol  : SSLv3
    Cipher    : RC4-MD5
    Session-ID: 56931DEEE4EDB5808FAC374D3AD7EC1C90A4FB4E2FF6DA16749203A87C7FA169

    Session-ID-ctx:
    Master-Key: C87463A6C17BFC2A8817F9B6B302C8EAE53B2BC25AB63A3DEA461EA495B20C78
B4AAF17DEED14661D8A09488215DCA7B
    Key-Arg   : None
    Start Time: 1112711406
    Timeout   : 300 (sec)
    Verify return code: 19 (self signed certificate in certificate chain)
---
closed

Ctrl+Z を押してから Enter キーを押すと、サーバーが応答するセッションを閉じることができます。

DONE

エラー 19 の詳細

上の例では、最終的な CA ルート証明書が自己署名されていることがわかります。すべての証明書チェーンの最終的な CA ルート証明書が自己署名されています。

エラー 19 は、s_client 関数がサーバーからの応答で渡される CA ルート証明書と照合してデフォルトの OpenSSL CA 証明書ストアをチェックしないために発生します。したがって、この証明書が既に CARootCerts ファイルに存在し、このファイルが openssl.cnf ファイルで正しく構成されていても、この関数は依然として自己署名証明書を信頼できません。

このエラーを回避するには、この s_client 関数の呼び出しで使用する信頼済み CA ルート証明書のコレクションを設定します。これにより、s_client 関数がサーバーからの応答で渡される CA ルート証明書と照合してデフォルトの OpenSSL CA 証明書ストアをチェックするようになります。

s_client からエラー 19 が発生しないようにするには、呼び出し元は次のいずれかの引数を渡す必要があります。