web-dev-qa-db-ja.com

JavaでのSSL例外:パスがどのトラストアンカーともチェーンしていません

MySQL Connector/J(バージョン5.1.45)とこのAWS RDSを使用して、MySQL内のdatabaseJavaとのSSL接続を確立しようとしています証明書はこちら: https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem

しかし、私は次のExceptionを取得しています:

Java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors

この例外をMySQL Connector/JExportControlled.Javaクラスline 297まで追跡できます:

CertPathValidatorResult result = this.validator.validate(certPath, this.validatorParams);

これはJREのようなCertPathValidatorセキュリティクラスに入るので、これ以上先に進むことはできません。

私はMySQL Connector/Jを使用してSSLマジック全体を実行しているので、私の手は縛られており、何が起こっているのか、またはこれを修正する方法がわかりません。証明書はMySQL WorkbenchIntelli J IDEA Databaseで正常に機能するため、現在拒否されている理由はわかりません。

これをどのように修正しますか?

7
mFeinstein

頭痛の種をたくさん食べた後、これを修正しました。トラストストアにはチェーンのすべての証明書が必要です。私は https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem を使用していましたが、これは理論的にはすべての証明書ですが、キーストアファイルにインポートすると、keytoolは最初の証明書以外をすべて無視するため、キーストアにはルート証明書しかなく、実際に必要なルートとAWSリージョン証明書はありません。

現在のところ、すべての証明書をインポートする方法はありません。PKCS7(証明書チェーンをサポート)への変換など、いくつかの方法を試しましたが、keytoolには証明書ごとに1つのエイリアスが必要なので、各証明書をインポートして、エイリアスを1つずつ指定します。

keytoolを呼び出して一度に1つの証明書をロードするプログラムを作成することも、私がそうであるように少し遅延して KeyStore Explorer を使用することもできます。新しいキーストアファイルを作成することを選択し、Examine Fileオプションを使用してバンドルされたpem証明書を開く必要があります。その証明書ごとにimportを選択すると、選択したものがインポートされます新しいキーストアへの証明書。最後に、キーストアファイルのパスワードを定義して保存するだけです。

11
mFeinstein

AWSは、バンドルだけでなく、個別の証明書を提供するようになりました。バンドルには不要な追加のものが含まれています。 SSLを使用したDBインスタンスへの接続の暗号化 を参照してください。

ルート証明書とリージョンの中間証明書の2つの証明書をダウンロードする必要があります。上記のリンクで述べたように、

すべてのリージョンで機能するルート証明書は https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem からダウンロードできます。

中間の証明書はページのさらに下にあります。データベースインスタンスが配置されているリージョンに適したものを使用する必要があります。

これらの両方を新しいキーストアにインポートするにはkeytoolを使用し、trustCertificateKeyStoreUrlおよびtrustCertificateKeyStorePasswordパラメータを介してそのキーストアを使用するようにMySQLに指示する必要があります。

これらすべてをTomcatで動作させるための追加のタスクがありました。接続URLを介して物事を設定するのが不運でした。機能したのは、接続プールのconnectionPropertiesuseSSL=true;requireSSL=true;verifyServerCertificate=true;trustCertificateKeyStoreUrl=file://[absolute path to keystore file];trustCertificateKeyStorePassword=[keystore password]に設定することでした。

4
Erica Kane

もう1つの問題は、 MySQLドキュメント が正しくないように見えることです。

次の接続プロパティについて説明します。

clientCertificateKeyStoreUrl=file:path_to_truststore_file 
clientCertificateKeyStorePassword=mypassword

正しい接続パラメーターは次のとおりです。

trustCertificateKeyStoreUrl
trustCertificateKeyStorePassword

この影響については、ページの「ユーザーのコメント」セクションに注記があります。

4
kdgregory

数時間前に5.1.45に移動すると、まったく同じエラーが発生しました。

5.1.42で今すぐ試して、問題が解決するかどうかを確認してください。

1
Renjith Pillai