2024年8月22日にAmazon RDSのCA証明書(rds-ca-2019)が期限切れとなり、新しい証明書(rds-ca-rsa2048-g1)への更新対応が必要となります。
利用しているAWSアカウント内に、有効期限が切れる証明書を使用しているAmazon RDSやAmazon Auroraデータベースが存在する場合、以下メール内容にて通知が届いているとのことです。
本記事では、Amazon RDSのCA証明書更新対応におけるデータベース(以下、DB)クライアント側での対応内容のうち、DBクライアントのCA証明書更新と接続文字列での証明書パス更新方法について記載します。
概要
2024年8月22日にAmazon RDSのCA証明書(rds-ca-2019)が期限切れとなり、新しい証明書(rds-ca-rsa2048-g1)への更新対応が必要となります。
それに伴い、DBクライアントやアプリケーションからの接続の際にSSL/TLS接続による暗号化を実施している、かつ接続時にCA証明書の検証が必要な場合は、DBクライアント側のCA証明書も更新対応が必要となります。
よって、更新対応を実施する前に現状DBクライアントからの接続方法を確認し、条件が当てはまる場合は更新対応を実施する形となります。
いずれにしても、RDSのCA証明書更新対応は期限までに必要となります。未対応の方は、以下記事にて対応方法を記載しているのでご覧ください!
blog.jbs.co.jp
※ DBクライアントからRDSへの接続において、SSL/TLS接続による暗号化を実施していない場合や、接続時にCA証明書の検証を実施していない場合はDBクライアント側での対応は不要となります。
また、使用しているDBクライアントが条件に当てはまるかどうか分からないという方は、各エンジンごとの確認方法を記載した記事も出しているのでご覧ください!
DBクライアント側のCA証明書更新対応後に、インスタンス側の証明書更新をご対応ください。
DBクライアント側での証明書更新対応
更新対応の流れとしては以下になります。
- 新しいCA証明書をDBクライアントへインポート
- DBインスタンスへの接続時に、検証するCA証明書のパスにてインポートした証明書を指定する
DBクライアントへのCA証明書のインポート
まずは、DBクライアントへのCA証明書のインポート方法について記載します。
新しいCA 証明書(rds-ca-rsa2048-g1)は下記サイトから取得可能になります。
docs.aws.amazon.com
新しい証明書バンドルには、古いCA証明書と新しいCA証明書の両方が含まれているため、アプリケーションを安全に更新し、移行期間に接続を維持することが可能になっています。
AWSリージョンごとで証明書バンドルが異なるため、RDSインスタンスが配置されているAWSリージョンの証明書バンドルをダウンロードして、対象のクライアント上の任意の場所に配置します。
※DBクライアントのOSがWindowsの場合は、PKCS7証明書バンドルをインストールしてください。
続いて、証明書のインポート方法について記載します。
DBクライアントのOSがLinuxとWindowsの2パターン記載していますので、該当する方をご参照いただければと思います。
Linux OSの場合
まず、証明書インポートのスクリプトを実行するには、Java開発キット(JDK)の一部であるkeytoolが使用されるため、事前にJDKをインストールしてください。
Red Hat Enterprise Linux 8におけるJDK1.8.0のインストールスクリプトは以下になります。
※ 以下コマンドはrootユーザーで実行する必要があります。
dnf install java-1.8.0-openjdk-devel
続いて、LinuxでCA証明書をインポートするためのスクリプトは以下になります。
mydir=tmp/certs if [ ! -e "${mydir}" ] then mkdir -p "${mydir}" fi truststore=${mydir}/rds-truststore.jks storepassword=changeit curl -sS "https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem" > ${mydir}/global-bundle.pem awk 'split_after == 1 {n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1}{print > "rds-ca-" n+1 ".pem"}' < ${mydir}/global-bundle.pem for CERT in rds-ca-*; do alias=$(openssl x509 -noout -text -in $CERT | perl -ne 'next unless /Subject:/; s/.*(CN=|CN = )//; print') echo "Importing $alias" keytool -import -file ${CERT} -alias "${alias}" -storepass ${storepassword} -keystore ${truststore} -noprompt rm $CERT done rm ${mydir}/global-bundle.pem echo "Trust store content is: " keytool -list -v -keystore "$truststore" -storepass ${storepassword} | grep Alias | cut -d " " -f3- | while read alias do expiry=`keytool -list -v -keystore "$truststore" -storepass ${storepassword} -alias "${alias}" | grep Valid | perl -ne 'if(/until: (.*?)\n/) { print "$1\n"; }'` echo " Certificate ${alias} expires in '$expiry'" done
Windows OSの場合
DBクライアントのOSがWindowsの場合の、証明書インポート手順になります。
※DBインスタンスへ接続する際、接続文字列内にてCA証明書のパスを直接指定する場合は本手順は不要となります。
1. 対象のDBクライアントにて、[コマンドの実行]を開き、[ファイル]メニュー>[スナップインの追加と削除]を開く
2. [スナップインの追加と削除]ダイアログボックスの[利用できるスナップイン]の中から、「証明書」を選択して[追加]をクリックする。
3. [証明書スナップイン]ダイアログボックスにて「コンピューターアカウント」を選択、[コンピュータの選択]ダイアログボックスにて「ローカルコンピューター」が選択されていることを確認して[完了]をクリックする。
4. [選択されたスナップイン]の中に「証明書」が追加されたことを確認して、[OK]をクリックする。
5. MMCコンソールで[証明書(ローカルコンピューター)]を展開して、[信頼されたルート証明機関]を右クリックで選択し、[すべてのタスク]>[インポート]の順にクリックする。
6. [証明書のインポートウィザード]のインポートファイル選択画面にて、取得した新しい証明書のパスを指定して[次へ]をクリックする。
7. 証明書ストア選択画面にて、「証明書はすべて次のストアに配置する」にチェックが入っていて「信頼されたルート証明機関」が指定されていることを確認して、[次へ]をクリックする。
8. 「証明書インポート ウィザードの完了」画面にて、[完了]をクリックする。
9. インポートが成功したことを示すダイアログボックスが表示されるので、[OK]をクリックする。
10. MMCコンソールで、「証明書(ローカルコンピューター)」>「信頼されたルート証明機関」の順で展開し、「証明書」をクリックする。
以上で、Windows サーバーでのCA証明書のインポートは完了です。
DBインスタンスへの接続にて検証するCA証明書の更新
CA証明書のインポートが完了したら、その証明書を使用して接続するよう接続文字列を更新します。
DBインスタンスごとに接続文字列が異なるため、それぞれの接続文字列の例を以下に記載します。
Maria DBインスタンス、MySQL DBインスタンス(Aurora MySQL DBインスタンス)へ接続する場合
接続文字列の「--ssl-ca」オプションに指定するCA証明書のパスを、新しくインストールしたCA証明書のパスへ変更します。
RDSのエンドポイント -uadmin -ppassword --ssl-ca=<span style="color: #d32f2f">/tmp/ap-northeast-1-bundle.pem<span> --ssl-mode=VERIFY_CA
PostgreSQL DBインスタンス(Aurora PostgreSQL DBインスタンス)の場合
接続文字列の「PGSSLROOTCERT」オプション、もしくは「sslrootcertオプションに指定するCA証明書のパスを、新しくインストールしたCA証明書のパスへ変更します。
PGSSLMODE=verify-full PGSSLROOTCERT=<span style="color: #d32f2f">/fullpath/ssl-cert.pem<span> psql -h RDSのエンドポイント -U masteruser -d postgres
psql "host=<RDSのエンドポイント> sslmode=verify-full sslrootcert=<span style="color: #d32f2f">/full/path/ssl-cert.pem<span> user=masteruser dbname=postgres"
以上の接続文字列更新によって、新しくインポートした証明書でDBインスタンスへ接続できることを確認してください。
まとめ
本記事では、DBクライアント側での証明書インポート手順および接続時のパス指定について記載しました。
DBインスタンスごとに接続方法や接続文字列が異なるため、お使いの環境を確認いただき、こちらの記事を参考にしていただけたら幸いです。
徐 一静(日本ビジネスシステムズ株式会社)
クラウドソリューション本部所属。主にAWSに関連する設計、構築を担当しています。Azureでも設計/構築経験ありです。 趣味はお笑いライブに行くことです。
担当記事一覧