SSLHandshakeException による接続の失敗

症状:

  • SSLHandshakeException はノードへの接続を失敗させ、構成に問題があることを示します。一般的な例外のいくつかは以下に示されており、これらの問題を解決するためのヒントがあります。

解決策:

  • java.security.cert.CertificateException: No name matching node01.example.com found
  • クライアント接続が node01.example.com に対して行われましたが、返された証明書には node01.example.com という名前が含まれていませんでした。ほとんどの場合、この問題は証明書作成時に名前が指定されていることを確認することで解決できます。詳細については、TLSを使用してノード間通信を暗号化するを参照してください。別のシナリオは、環境が証明書にDNS名を全く使用したくない場合です。このシナリオでは、elasticsearch.yml のすべての設定は、network.publish_host 設定を含め、IPアドレスのみを使用する必要があります。
  • java.security.cert.CertificateException: No subject alternative names present
  • クライアント接続がIPアドレスに対して行われましたが、返された証明書には SubjectAlternativeName エントリが含まれていませんでした。IPアドレスは、証明書作成時に SubjectAlternativeName として指定されている場合にのみ、ホスト名の検証に使用されます。ホスト名の検証にIPアドレスを使用する意図があった場合、適切なIPアドレスで証明書を再生成する必要があります。詳細については、TLSを使用してノード間通信を暗号化するを参照してください。
  • javax.net.ssl.SSLHandshakeException: null cert chainjavax.net.ssl.SSLException: Received fatal alert: bad_certificate
  • SSLHandshakeException は、クライアントによって返された自己署名証明書が信頼されていないことを示します。これは truststore または keystore に見つからないためです。この SSLException は接続のクライアント側で見られます。
  • sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested targetjavax.net.ssl.SSLException: Received fatal alert: certificate_unknown
  • この SunCertPathBuilderException は、ハンドシェイク中に返された証明書が信頼されていないことを示します。このメッセージは接続のクライアント側で見られます。SSLException は接続のサーバー側で見られます。返された証明書に署名したCA証明書は keystore または truststore に見つからず、この証明書を信頼するために追加する必要があります。
  • javax.net.ssl.SSLHandshakeException: Invalid ECDH ServerKeyExchange signature
  • Invalid ECDH ServerKeyExchange signature は、キーと対応する証明書が一致せず、ハンドシェイクの失敗を引き起こしていることを示す場合があります。構成された証明書機関、証明書、およびキーに使用している各ファイルの内容を確認してください。特に、キーと証明書が同じキー ペアに属していることを確認してください。