1. ホーム
  2. ssl

[解決済み] クライアント証明書を使用しようとしたときのsslv3 alert handshakeの失敗の解決法

2022-03-13 14:30:47

質問

認証のために証明書を必要とするサービスに接続しようとしています。プロセスは、私がサービスにCSRファイルを送信することです。サービスはCSRに署名し、接続に使用する証明書を私に送ります。

  1. 以下のコマンドラインでCSRを生成しました。

    openssl req -new -nodes -newkey rsa:2048 -keyout cert.key -out cert.csr
    
    
  2. cert.csrの中身を取り出し、送信しました。彼らはクライアント証明書を生成し、私はPEMファイルを取り戻しました。

  3. 次に、SSLCERT の証明書ファイルを curl() に使用し、cert.key の秘密鍵を CURLOPT_SSLKEY - (ステップ 1 で取得) として提供して、接続を試みました。

  4. で失敗します。 error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure

このプロセスの中で、私は何を間違えているのでしょうか?

動作する 秘密鍵を含むテスト証明書をサービスから受け取って試したところ(自己署名証明書)。しかし、私のCSRから生成された証明書を使い、私の秘密鍵を鍵として使用すると、ハンドシェイクに失敗してエラーになります。

だから、他の人が解決策を調べるときに見つけた、openssl / curlがv3/TLSなどをサポートしていないこととは関係ないと分かっている。

以下は、私が実行したものです。

  curl -i -v --request POST https://service.com/ --cert clientcert.pem --key private_key.pem --cert-type pem --tlsv1.1 --insecure
* Connected to service.com (1xx.xxx.xxx.xx) port 443 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server key exchange (12):
* SSLv3, TLS handshake, Request CERT (13):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS handshake, CERT verify (15):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS alert, Server hello (2):
* error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure
* Closing connection 0

以下のバージョンが動作しています: curl 7.35.0 (x86_64-pc-linux-gnu) libcurl/7.35.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 librtmp/2.3

解決するには?

明確な回答ではありませんが、コメント欄には書ききれないほどです。

私は、発行者が間違っている証明書を渡されたのではないかと考えています(サーバーの 可能性がある は、より具体的なアラートコードを使用してください)、または間違ったサブジェクトを使用してください。その証明書があなたの秘密鍵と一致することは分かっています。 curlopenssl client しかし、実際にそれが希望するCAと一致するかどうかはわかりません。なぜなら、あなたのcurlはopensslを使用しており、openssl SSLクライアントは設定されたクライアント証明書がcertreq.CAと一致するかどうかを強制しないためです。

行う openssl x509 <clientcert.pem -noout -subject -issuer と、テスト用P12の証明書でも同じように動作します。する openssl s_client (を確認し(あるいは確認したものを)、その下を見る。 Acceptable client certificate CA names その名前、またはそのいずれかが、あなたの証明書の発行元と一致するはずです。もしそうでなければ、それはあなたの問題であり、あなたが正しい場所に正しい方法でCSRを提出したことを彼らに確認する必要があります。また、地域やビジネスライン、テスト版とプロッド版、アクティブ版とペンディング版など、さまざまな制度がある可能性があります。

あなたの証明書の発行者が希望するCAと一致する場合、そのサブジェクトを作業用(テストP12)のものと比較してください:両者は同じようなフォーマットですか?もし、それが可能なら、test-P12とまったく同じか、できるだけ近いサブジェクト名のCSRを生成して提出し、よりうまく動作する証明書が生成されるかどうかを確認してください。(新しい キー しかし、もしそうするのであれば、どの証明書がどのキーと一致するかを記録しておくと、それらが混同されずに済みます)。それでもだめなら、証明書の拡張子を openssl x509 <cert -noout -text は、KeyUsage、ExtendedKeyUsage、Policy、Constraints、あるいは非標準的なものなど、サブジェクト認証に関連する可能性のある差異がないか確認します。

他のすべてが失敗した場合、サーバーオペレータ(複数可)に問題について彼らのログが何を言っているか尋ねるか、またはあなた自身がログを見るアクセス権を持っている場合。