58

バックグラウンド

SSL サーバーとクライアント証明書によって保護された API を使用するサービス プロバイダーとの責任追及で立ち往生しています。

  • CSR を生成し、パブリック CA (この場合は GoDaddy) から証明書を取得し、証明書と CA チェーンをサービス プロバイダーに提供しました。
  • 彼らは、CA と私のクライアント証明書をゲートウェイにロードしたと思われます。
  • 私は最も基本的なレベルのテストを使用して作業していますopenssl s_client -connect ... -cert ... -key ...
  • プロバイダは、ログに私の要求にクライアント SSL 証明書がまったく含まれていないことを示していると伝えています。
  • 奇妙なことに、証明書の適切な CA 発行者が、SSL ハンドシェイク中に提供される「受け入れ可能なクライアント証明書 CA 名」のリストに表示されます。
  • 参考までに、私が作成してテスト用に提供した自己署名証明書は、実際には正しく機能します。

サンプル (失敗) リクエスト

[shell ~]$ openssl s_client -connect host:443 -cert cert_and_key.pem -key cert_and_key.pem -state -quiet
CONNECTED(00000003)
SSL_connect:before/connect initialization
SSL_connect:SSLv2/v3 write client hello A
SSL_connect:SSLv3 read server hello A
depth=2 **SNIP**
verify return:1
depth=1 **SNIP**
verify return:1
depth=0 **SNIP**
verify return:1
SSL_connect:SSLv3 read server certificate A
SSL_connect:SSLv3 read server key exchange A
SSL_connect:SSLv3 read server certificate request A
SSL_connect:SSLv3 read server done A
SSL_connect:SSLv3 write client certificate A
SSL_connect:SSLv3 write client key exchange A
SSL_connect:SSLv3 write certificate verify A
SSL_connect:SSLv3 write change cipher spec A
SSL_connect:SSLv3 write finished A
SSL_connect:SSLv3 flush data
SSL3 alert read:fatal:unknown CA
SSL_connect:failed in SSLv3 read finished A
140011313276744:error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca:s3_pkt.c:1197:SSL alert number 48
140011313276744:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

エラーの私の解釈SSL3 alert read:fatal:unknown CAは、サーバーが私が(実際に)提供している証明書の発行者を認識していないということです。しかし、プロバイダーは、CA 証明書が適切に読み込まれていることを「保証」しており、それ以外の方法でそれらを納得させることはできませんでした.

質問

したがって、他の (広範な) トラブルシューティング手順はさておき、私が本当に知りたいのは次のとおりです。

openssl s_clientクライアント証明書がサーバーによって要求されただけでなく、実際には SSL ハンドシェイク中にサーバーに送信されたことを決定的に示す出力がありますか?

-state-msg-debugおよびオプションを試しましたが-trace、出力を解釈するのに必要なバックグラウンドがありません。

EJP の回答は、私が提供したサンプル出力write client certificate Aが.-cert

4

2 に答える 2

106

-stateクライアント証明書がサーバーに送信されていることを確認するには、と-debugフラグの組み合わせからの出力を分析する必要があります。

まずベースラインとして、実行してみてください

$ openssl s_client -connect host:443 -state -debug

大量の出力が得られますが、関心のある行は次のようになります。

SSL_connect:SSLv3 read server done A
write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC))
0000 - 16 03 01 00 07 0b 00 00-03                        .........
000c - <SPACES/NULS>
SSL_connect:SSLv3 write client certificate A

ここで何が起きているか:

  • -stateフラグは、前のセクションの終わりを表示する責任があります。

    SSL_connect:SSLv3 read server done A  
    

    これは、出力で自分の場所を見つけるのを助けるためにのみ重要です。

  • 次に、-debugフラグは次のステップで送信される生のバイトを示しています。

    write to 0x211efb0 [0x21ced50] (12 bytes => 12 (0xC))
    0000 - 16 03 01 00 07 0b 00 00-03                        .........
    000c - <SPACES/NULS>
    
  • 最後に、フラグは、エコー -stateされたステップの結果を再度報告しています。-debug

    SSL_connect:SSLv3 write client certificate A
    

言い換えればs_client、サーバーから送信されたデータの読み取りを終了し、12 バイトを (私が想定しているのは) 「クライアント証明書なし」メッセージとしてサーバーに送信したということです。


テストを繰り返しますが、今回は次のように-certand-keyフラグを含めます。

$ openssl s_client -connect host:443 \
   -cert cert_and_key.pem \
   -key cert_and_key.pem  \
   -state -debug

「read server done」行と「write client certificate」行の間の出力は、クライアント証明書のバイナリ形式を表す、はるかに長くなります。

SSL_connect:SSLv3 read server done A
write to 0x7bd970 [0x86d890] (1576 bytes => 1576 (0x628))
0000 - 16 03 01 06 23 0b 00 06-1f 00 06 1c 00 06 19 31   ....#..........1
(*SNIP*)
0620 - 95 ca 5e f4 2f 6c 43 11-                          ..^%/lC.
SSL_connect:SSLv3 write client certificate A

1576 bytesそれ自体で証明書が送信されたことを示す優れた指標ですが、その上、右側の列には、人間が判読できる証明書の一部が表示されます。そこに証明書。

于 2013-06-27T15:27:33.393 に答える