

# SSL/TLS 証明書のローテーション
<a name="UsingWithRDS.SSL-certificate-rotation"></a>

Amazon RDS 認証局証明書 rds-ca-2019 は、2024 年 8 月に期限切れになりました。RDS DB インスタンスまたはマルチ AZ DB クラスターへの接続に証明書検証付きの Secure Sockets Layer (SSL) または Transport Layer Security (TLS) を使用しているか、使用する予定がある場合は、新しい CA 証明書 rds-ca-rsa2048-g1、rds-ca-rsa4096-g1、または rds-ca-ecc384-g1 のいずれかの使用を検討してください。現在、証明書検証付きで SSL/TLS を使用していない場合でも、CA 証明書の有効期限が切れている可能性があり、証明書検証付きで SSL/TLS を使用して RDS データベースに接続する予定がある場合は、新しい CA 証明書に更新する必要があります。

Amazon RDS では、AWS セキュリティのベストプラクティスとして、新しい CA 証明書を提供しています。新しい証明書およびサポートしている AWS リージョンの詳細については、「[SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化](UsingWithRDS.SSL.md)」を参照してください。

データベースの CA 証明書を更新するには、次の方法を使用します。
+  [DB インスタンスまたはクラスターの変更による CA 証明書の更新](#UsingWithRDS.SSL-certificate-rotation-updating) 
+  [メンテナンスの適用による CA 証明書の更新](#UsingWithRDS.SSL-certificate-rotation-maintenance-update) 

新しい CA 証明書を使用するように DB インスタンスまたはマルチ AZ DB クラスターを更新する前に、RDS データベースに接続するクライアントまたはアプリケーションを必ず更新します。

## 証明書を更新する際の考慮事項
<a name="UsingWithRDS.SSL-certificate-rotation-considerations"></a>

証明書を更新する前に、次の状況を考慮してください。
+ Amazon RDS Proxy  は AWS Certificate Manager (ACM) の証明書を使用します。RDS Proxy を使用している場合は、SSL/TLS 証明書を更新するときに、RDS Proxy 接続を使用するアプリケーションを更新する必要はありません。詳細については、「[RDS Proxy での TLS/SSL の使用](rds-proxy.howitworks.md#rds-proxy-security.tls)」を参照してください。
+ 2020 年 7 月 28 日より前に作成された、または rds-ca-2019 証明書にアップデートされた DB インスタンスまたはマルチ AZ DB クラスターで Go バージョン 1.15 アプリケーションを使用している場合は、証明書を再度更新する必要があります。エンジンに応じて、証明書を rds-ca-rsa2048-g1、rds-ca-rsa4096-g1、または rds-ca-ecc384-g1 に更新してください。

  新しい CA 証明書識別子を使用して、DB インスタンスの場合は `modify-db-instance` コマンド、またはマルチ AZ DB クラスターの場合は `modify-db-cluster` コマンドを使用します。`describe-db-engine-versions` コマンドを使用すると、特定の DB エンジンと DB エンジンのバージョンで使用できる CA を検索できます。

  2020 年 7 月 28 日以降にデータベースを作成したか、その証明書を更新した場合、必要なアクションはありません。詳細については、[Go GitHub issue \$139568](https://github.com/golang/go/issues/39568) を参照してください。

## DB インスタンスまたはクラスターの変更による CA 証明書の更新
<a name="UsingWithRDS.SSL-certificate-rotation-updating"></a>

次の例では、CA 証明書を *rds-ca-2019* から *rds-ca-rsa2048-g1* に更新します。別の証明書を選択できます。詳細については、「[認証局](UsingWithRDS.SSL.md#UsingWithRDS.SSL.RegionCertificateAuthorities)」を参照してください。

アプリケーションの信頼ストアを更新して、CA 証明書の更新に関連するダウンタイムを短縮します。CA 証明書のローテーションに関連する再起動の詳細については、「[サーバー証明書の自動ローテーション](#UsingWithRDS.SSL-certificate-rotation-server-cert-rotation)」を参照してください。

**DB インスタンスまたはクラスターを変更して CA 証明書を更新するには**

1. 「[SSL/TLS を使用した DB インスタンスまたはクラスターへの接続の暗号化](UsingWithRDS.SSL.md)」の説明に従って、新しい SSL/TLS 証明書をダウンロードします。

1. 新しい SSL/TLS 証明書を使用するようにアプリケーションを更新します。

   新しい SSL/TLS 証明書のアプリケーションを更新する方法は、特定のアプリケーションにより異なります。アプリケーション開発者と協力して、アプリケーションの SSL/TLS 証明書を更新します。

   SSL/TLS 接続の確認および各 DB エンジン用アプリケーションの更新については、以下のトピックを参照してください。
   +  [新しい SSL/TLS 証明書を使用して MariaDB インスタンスに接続するようにアプリケーションを更新する](ssl-certificate-rotation-mariadb.md) 
   +  [新しい SSL/TLS 証明書を使用して Microsoft SQL Server DB インスタンスに接続するようにアプリケーションを更新する](ssl-certificate-rotation-sqlserver.md) 
   +  [新しい SSL/TLS 証明書を使用して MySQL DB インスタンスに接続するようにアプリケーションを更新する](ssl-certificate-rotation-mysql.md) 
   +  [新しい SSL/TLS 証明書を使用して Oracle DB インスタンスに接続するようにアプリケーションを更新する](ssl-certificate-rotation-oracle.md) 
   +  [新しい SSL/TLS 証明書を使用して PostgreSQL DB インスタンスに接続するようにアプリケーションを更新する](ssl-certificate-rotation-postgresql.md) 

   Linux オペレーティングシステムの信頼ストアを更新するサンプルスクリプトについては、「[証明書を信頼ストアにインポートするためのサンプルスクリプト](#UsingWithRDS.SSL-certificate-rotation-sample-script)」を参照してください。
**注記**  
証明書バンドルには古い CA と新しい CA の両方の証明書が含まれます。そのため、アプリケーションを安全に更新し、移行期間に接続を維持することができます。AWS Database Migration Service を使用してデータベースを DB インスタンスまたはクラスターに移行する場合は、移行中の接続を確保するために証明書バンドルを使用することをお勧めします。

1. DB インスタンスまたはマルチ AZ DB クラスターを変更して、CA を **rds-ca-2019** から **rds-ca-rsa2048-g1** に変更します。CA 証明書を更新するためにデータベースの再起動が必要かどうかを確認するには、[describe-db-engine-versions](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-engine-versions.html) コマンドを使用して、`SupportsCertificateRotationWithoutRestart` フラグをチェックします。
**重要**  
証明書の有効期限が切れた後に接続の問題が発生した場合は、コンソールで [**すぐに適用**] を指定するか、`--apply-immediately` を使用して AWS CLI オプションを指定します。デフォルトで、このオペレーションは次のメンテナンスウィンドウの間に実行するようスケジュールされています。  
RDS for Oracle DB インスタンスでは、接続エラーを防ぐために Oracle DB を再起動することをお勧めします。  
常時オプションやミラーリングオプションが有効になっている RDS for SQL Server のマルチ AZ インスタンスの場合、証明書ローテーション後にインスタンスを再起動すると、フェイルオーバーが予想されます。  
デフォルト RDS CA と異なるインスタンス CA のオーバーライドを設定するには、[modify-certificates](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-certificates.html) CLI コマンドを使用します。

AWS マネジメントコンソール または AWS CLI を使用して、DB インスタンスまたはマルチ AZ DB クラスターの CA 証明書を **rds-ca-2019** から **rds-ca-rsa2048-g1** に変更できます。

------
#### [ Console ]

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで、**[データベース]** を選択し、変更する DB インスタンスまたはマルチ AZ DB クラスターを選択します。

1. **[Modify]** (変更) を選択します。  
![\[DB インスタンスまたはマルチ AZ DB クラスターを変更する\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-modify.png)

1. **[接続]** セクションで、**[rds-ca-rsa2048-g1]** を選択します。  
![\[CA 証明書の選択\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-ca-rsa2048-g1.png)

1. [**Continue**] を選択して、変更の概要を確認します。

1. 変更をすぐに反映させるには、[**Apply immediately**] を選択します。

1. 確認ページで、変更内容を確認します。変更内容が正しい場合は、**[DB インスタンスを変更]** または **[クラスターを変更]** を選択して変更を保存します。
**重要**  
このオペレーションをスケジュールする場合は、必ずクライアント側の信頼ストアを事前に更新します。

   または、[**戻る**] を選択して変更を編集するか、[**キャンセル**] を選択して変更をキャンセルします。

------
#### [ AWS CLI ]

AWS CLI を使用して DB インスタンスまたはマルチ AZ DB クラスターの CA を **rds-ca-2019** から **rds-ca-rsa2048-g1** に変更するには、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) または [modify-db-cluster](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-cluster.html) コマンドを呼び出します。DB インスタンスまたはクラスター識別子および `--ca-certificate-identifier` オプションを指定します。

`--apply-immediately` パラメータを使用して更新を直ちに適用します。デフォルトで、このオペレーションは次のメンテナンスウィンドウの間に実行するようスケジュールされています。

**重要**  
このオペレーションをスケジュールする場合は、必ずクライアント側の信頼ストアを事前に更新します。

**Example**  
 **DB インスタンス**   
次の例では、CA 証明書を `rds-ca-rsa2048-g1` に設定することにより、`mydbinstance` を変更しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-instance \
    --db-instance-identifier mydbinstance \
    --ca-certificate-identifier rds-ca-rsa2048-g1
```
Windows の場合:  

```
aws rds modify-db-instance ^
    --db-instance-identifier mydbinstance ^
    --ca-certificate-identifier rds-ca-rsa2048-g1
```
インスタンスを再起動する必要がある場合、[modify-db-instance](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-instance.html) CLI コマンドを使用して、`--no-certificate-rotation-restart` オプションを指定できます。

**Example**  
 **マルチ AZ DB クラスター**   
次の例では、CA 証明書を `rds-ca-rsa2048-g1` に設定することにより、`mydbcluster` を変更しています。  
Linux、macOS、Unix の場合:  

```
aws rds modify-db-cluster \
    --db-cluster-identifier mydbcluster \
    --ca-certificate-identifier rds-ca-rsa2048-g1
```
Windows の場合:  

```
aws rds modify-db-cluster ^
    --db-cluster-identifier mydbcluster ^
    --ca-certificate-identifier rds-ca-rsa2048-g1
```

------

## メンテナンスの適用による CA 証明書の更新
<a name="UsingWithRDS.SSL-certificate-rotation-maintenance-update"></a>

メンテナンスを適用して CA 証明書を更新するには、次のステップを実行します。

------
#### [ Console ]

**メンテナンスを適用して CA 証明書を更新するには**

1. AWS マネジメントコンソール にサインインし、Amazon RDS コンソール ([https://console.aws.amazon.com/rds/](https://console.aws.amazon.com/rds/)) を開きます。

1. ナビゲーションペインで **[証明書の更新]** を選択します。  
![\[ナビゲーションペインの証明書の更新オプション\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-certupdate.png)

   **[証明書の更新が必要なデータベース]** ページが表示されます。  
![\[データベースの CA 証明書の更新\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-update-multiple.png)
**注記**  
このページには、現在の AWS リージョン リージョンの DB インスタンスおよびクラスターのみが表示されます。複数の AWS リージョン にデータベースがある場合は、このページを AWS リージョン ごとにチェックし、古い SSL/TLS 証明書を使用しているすべての DB インスタンスを確認します。

1. 更新する DB インスタンスまたはマルチ AZ DB クラスターを選択します。

   **[スケジュール]** を選択すると、次のメンテナンスウィンドウでの証明書の更新をスケジュールできます。**[今すぐ適用]** を選択して、直ちに更新を適用します。
**重要**  
証明書の有効期限が切れた後に接続の問題が発生した場合は、**[今すぐ適用]** オプションを使用します。

1. 

   1. **[スケジュール]** を選択すると、CA 証明書のローテーションの確認を求められます。このプロンプトには、アップデートのスケジュール期間も記載されています。  
![\[証明書の更新の確認\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-confirm-schedule.png)

   1. **[今すぐ適用]** を選択すると、CA 証明書のローテーションの確認を求められます。  
![\[証明書の更新の確認\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/images/ssl-rotate-cert-confirm-now.png)
**重要**  
データベースでの CA 証明書の更新をスケジュールする前に、SSL/TLS とサーバー証明書を接続に使用するクライアントアプリケーションを更新します。これらの更新は、DB エンジンに固有です。これらのクライアントアプリケーションを更新したら、CA 証明書の更新を確認できます。

   続行するには、チェックボックスをオンにし、[**確認**] を選択します。

1. 更新する DB インスタンスおよびクラスターごとに、ステップ 3 と 4 を繰り返します。

------

## サーバー証明書の自動ローテーション
<a name="UsingWithRDS.SSL-certificate-rotation-server-cert-rotation"></a>

ルート CA がサーバー証明書の自動ローテーションをサポートしている場合、RDS は DB サーバー証明書のローテーションを自動的に処理します。RDS はこの自動ローテーションに同じルート CA を使用するため、新しい CA バンドルをダウンロードする必要はありません。「[認証局](UsingWithRDS.SSL.md#UsingWithRDS.SSL.RegionCertificateAuthorities)」を参照してください。

DB サーバー証明書のローテーションと有効期間は DB エンジンによって異なります。
+ DB エンジンが再起動なしのローテーションをサポートしている場合、ユーザーによるアクションがなくても、RDS は DB サーバー証明書を自動的にローテーションします。RDS は、DB サーバー証明書の半減期になった時点で、希望するメンテナンス期間に DB サーバー証明書のローテーションを試みます。新しい DB サーバー証明書は、12 か月間有効です。
+ DB エンジンが再起動せずにローテーションをサポートしていない場合、Amazon RDS は、証明書の半分、または有効期限の少なくとも 3 か月前に、Describe-pending-maintenance-actions API を介して `server-certificate-rotation` 保留中のメンテナンスアクションを表示します。apply-pending-maintenance-action API を使用してローテーションを適用できます。新しい DB サーバー証明書は、36 か月間有効です。

[ describe-db-engine-versions](https://docs.aws.amazon.com/cli/latest/reference/rds/describe-db-engine-versions.html) コマンドを使用して、`SupportsCertificateRotationWithoutRestart` フラグを点検することで、再起動なしで DB エンジンバージョンが証明書のローテーションをサポートするかどうかを特定します。詳細については、「[データベースに CA を設定する](UsingWithRDS.SSL.md#UsingWithRDS.SSL.RegionCertificateAuthorities.Selection)」を参照してください。

## 証明書を信頼ストアにインポートするためのサンプルスクリプト
<a name="UsingWithRDS.SSL-certificate-rotation-sample-script"></a>

次のサンプルシェルスクリプトでは、証明書バンドルを信頼ストア内にインポートします。

各サンプルシェルスクリプトでは、Java 開発キット (JDK) の一部である keytool が使用されます。JDK のインストールの詳細については、「[JDK インストールガイド](https://docs.oracle.com/en/java/javase/17/install/overview-jdk-installation.html)」を参照してください。

------
#### [ Linux ]

Linux オペレーティングシステムで、証明書バンドルを信頼ストアにインポートするサンプルシェルスクリプトを次に示します。

```
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
```

------
#### [ macOS ]

macOS で証明書バンドルを信頼ストアにインポートするサンプルシェルスクリプトを次に示します。

```
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
split -p "-----BEGIN CERTIFICATE-----" ${mydir}/global-bundle.pem rds-ca-

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
```

------