SQL Server(AWS RDS)への接続でタイトルのエラーが発生しました。
エラーメッセージは以下のとおりです。
“encrypt” property is set to “true” and “trustServerCertificate” property is set to “false” but the driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL) encryption: Error: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. ClientConnectionId:xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx [SQL State=xxxxx]
結論から申し上げると、接続文字列にtrustServerCertificate=false;を追加すると接続できました。
以下、ChatGPTにエラー内容について質問して、得られた回答です。
このエラーメッセージは、SSL(セキュアソケットレイヤー)を使用してSQLサーバーにセキュアに接続しようとした際に、信頼できる証明書が見つからなかったことを示しています。この問題を解決するには、次の手順を試してください。
- 証明書の確認: まず、接続先のRDSインスタンスの証明書を確認します。AWS RDSでは、証明書が提供されているはずです。その証明書が、あなたのJavaアプリケーションが利用しているJava KeyStoreにインポートされていることを確認してください。
- Java KeyStoreへの証明書のインポート: 証明書がインポートされていない場合、Java KeyStoreに証明書をインポートする必要があります。以下は、証明書(
rds-ca-2019-root.pem
)をJava KeyStoreにインポートする例です。
keytool -import -alias rds-root -keystore $JAVA_HOME/jre/lib/security/cacerts -file rds-ca-2019-root.pem
このコマンドはkeytool
というJavaツールを使用しています。$JAVA_HOME
はJavaのインストールディレクトリを指します。-keystore
オプションでKeyStoreの場所を指定し、-file
オプションでインポートする証明書の場所を指定します。 - trustServerCertificateプロパティの確認: “trustServerCertificate”プロパティが”false”に設定されている場合、証明書が信頼できるかどうかを確認します。証明書が信頼できる場合、このプロパティを”true”に設定することで、証明書の検証をスキップできます。ただし、これはテスト環境でのみ推奨されます。本番環境では証明書の検証を有効にしてください。
- 接続文字列の確認: 接続文字列が正しいか確認します。例えば、
jdbc:sqlserver://<hostname>:<port>;databaseName=<dbname>;encrypt=true;trustServerCertificate=false;
という形式になります。 - 証明書の有効期限の確認: 証明書が有効期限切れでないことを確認してください。
- ネットワーク接続の確認: RDSインスタンスとのネットワーク接続が適切であることを確認してください。
上記の手順で問題が解消しない場合は、エラーメッセージやログを詳しく確認し、必要に応じてAWSサポートに連絡してください。
trustServerCertificate=false
は、接続文字列の一部として指定される設定です。この設定は、SSL接続時にサーバーの証明書が信頼されるかどうかを決定します。
trustServerCertificate=true
: サーバー証明書の検証をスキップします。証明書が自己署名の場合でも接続は許可されます。この設定は、開発やテスト環境では便利ですが、本番環境で使用するとセキュリティリスクがあるため推奨されません。trustServerCertificate=false
: サーバー証明書を検証します。証明書は、クライアントのトラストストアにある証明書チェーンと一致する必要があります。一致しない場合、接続は拒否されます。本番環境での使用が推奨されます。
総合的に、trustServerCertificate=false
を設定することは、安全な接続を確保するために重要です。サーバーの証明書が正しく検証されることで、Man-in-the-Middle攻撃などのセキュリティリスクを低減できます。