SSLが失敗したことを示すアラート「SSL3_READ_BYTES:sslv3 alert bad certificate」


17

以下のコマンドopenssl s_client -host example.xyz -port 9093の実行中

次のエラーが表示されます。

139810559764296:error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:s3_pkt.c:1259:SSL alert number 42
39810559764296:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:184:

しかし、最後に"Verify return code: 0 (ok)"メッセージを受け取ります。

私の質問は、上記のアラートが何を意味し、SSLが実際に成功したかどうかです。事前に助けてくれてありがとう。

SSL handshake has read 6648 bytes and written 354 bytes
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
Protocol  : TLSv1.2
Cipher    : AES128-SHA
Session-ID: xx
Session-ID-ctx:
Master-Key: xx
Key-Arg   : None
Krb5 Principal: None
PSK identity: None
PSK identity hint: None
Start Time: 1475096098
Timeout   : 300 (sec)
**Verify return code: 0 (ok)**

回答:


25

「ハンドシェイクの失敗」は、ハンドシェイクが失敗し、SSL / TLS接続が存在しないことを意味します。opensslシェル(またはCMDなど)が終了し、入力データがサーバーに送信されるのを待たないことがわかります。「戻りコード0を検証する」とは、サーバーの証明書に問題が見つからなかったことを意味します。これは、まったくチェックされなかったか、チェックされて良好だったためです(OpenSSLのチェックでは、すべてをカバーしているわけではありません)。この場合、プロトコルを知ることで、後者のケースが当てはまると推測できます。

アラートの受信bad certificate(コード42)は、サーバーが証明書による認証要求することを意味しますが、ユーザーは認証を行わなかったため、ハンドシェイクエラーが発生しました。ラインの前に数行SSL handshake has read ... and written ...あなたがライン表示されるはずAcceptable client certificate CA namesおそらく始まる行が続く通常のCAを識別し、いくつかの行が続き、Client Certificate TypesそしておそらくいくつかについてのRequested Signature AlgorithmsあなたのOpenSSLのバージョンと交渉したプロトコルに応じて。

「受け入れ可能な」リストでCAが発行した証明書を見つけるか、空であった場合は、信頼できるCAを示すサーバーに関するドキュメントを探すか、サーバーオペレーターまたは所有者に問い合わせて、一致する秘密キー、両方PEM形式で、;で指定-cert $file -key $fileます。PEMで可能なように、1つのファイルに両方がある場合は、-cert $file。別の形式のファイルがある場合は、指定するか、ここで検索して、おそらくスーパーユーザーとsecurity.SXを検索します。さまざまな証明書と秘密鍵の形式の変換に関するQ&Aがすでに多くあります。証明書が「チェーン」または「中間」証明書(または1つ以上)を検証する必要がある場合、サーバーの構成方法に応じてパブリックCA(社内CA)からの証明書がよくあることですが、s_clientトリックが必要です:チェーン証明書をシステムのトラストストアに追加するか、サーバーと送信する必要のあるチェーン証明書を検証するために必要なCA証明書を含むローカル/一時トラストストアを作成します。

そのような証明書がない場合は、証明書を取得する必要があります。これは、回答するためにさらに詳細を必要とする別の質問であるか、証明書認証を使用せずにサーバーに接続する方法を見つける必要があります。再度ドキュメントを確認するか、オペレーターまたは所有者に問い合わせてください。

編集:クライアントキーと証明書チェーン、およびJavaのサーバーアンカーを持っている可能性があるコメントから表示されます。チェックすると、そのケースを完全にカバーする良い既存の答えが表示されないので、これはおそらくうまく検索できませんが:

# Assume Java keystore is type JKS (the default but not only possibility)
# named key.jks and the privatekey entry is named mykey (ditto)
# and the verify certs are in trust.jks in entries named trust1 trust2 etc.

# convert Java key entry to PKCS12 then PKCS12 to PEM files
keytool -importkeystore -srckeystore key.jks -destkeystore key.p12 -deststoretype pkcs12 -srcalias mykey 
openssl pkcs12 -in key.p12 -nocerts -out key.pem
openssl pkcs12 -in key.p12 -nokeys -clcerts -out cert.pem
openssl pkcs12 -in key.p12 -nokeys -cacerts -out chain.pem
# extract verify certs to individual PEM files
# (or if you 'uploaded' PEM files and still have them just use those)
keytool -keystore trust.jks -export -alias trust1 -rfc -file trust1.pem
keytool -keystore trust.jks -export -alias trust2 -rfc -file trust2.pem
... more if needed ...
# combine for s_client 
cat chain.pem trust*.pem >combined.pem
openssl s_client -connect host:port -key key.pem -cert cert.pem -CAfile combined.pem

こんにちはDave; 以下は私たちが従った手順です。1:ルートCAと中間証明書をキーストアにアップロードします。2:署名済みのComodo証明書をキーストアにアップロードします。3:ルートCAと中間証明書をトラストストアにアップロードします。4:キーストアとトラストファイルをクラスター内のすべてのノード(cassandra)にコピーします。ノードは通信にSSLを使用し、問題なくデータを拡張しているようです。ただし、上記のSSLコマンドを実行すると、問題が発生します。
kris433

@ kris433:それはどのキーストアですか?標準のJavaインストールを使用している場合はデフォルトがありますが、「署名されたComodo証明書」を取得するプライベートキーがすでに生成されている場合(のみ)、Javaの手順のように聞こえますComodoを含むトラストストアなので、変更する必要はありません。OpenSSLはJavaキーストアまたはトラストストアを使用せず、デフォルトではキーストアをまったく使用しないため、-cert [-key]でファイルを指定する必要があります。コメントを正しく解釈したら、編集をご覧ください。
-dave_thompson_085

デイブ、どうもありがとう。これは完全に機能しました。あなたは私の週を救った。フィラデルフィアに来たことがあれば、チーズステーキとジェラートが私の上にあります;)。ありがとうございました。
kris433

@ kris433:あなたしている歓迎、しかしStackExchange公式の方法は、チェックマークを使用して有用な答えを受け入れることですので、システムが自動的に結果を表示する際に、この情報を使用することができ、他の querents。このサイトにアクセスしたときに見るはずだった「ツアー」、具体的にはserverfault.com/help/someone-answersをご覧ください。
-dave_thompson_085

0

私の場合、秘密鍵が証明書と一致しなかったときにこのエラーが発生しました。私の証明書の有効期限が切れ、新しい秘密鍵を作成する必要があるときに証明書を更新しました。ただし、アプリでそれを参照するのを忘れていました。新しい秘密キーを指定すると、このエラーはなくなりました。

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