

# 新しい SSL/TLS 証明書を使用して Aurora PostgreSQL DB クラスターに接続するようにアプリケーションを更新する
<a name="ssl-certificate-rotation-aurora-postgresql"></a>

2023 年 1 月 13 日に Amazon RDS は、Secure Socket Layer または Transport Layer Security（SSL/TLS）を使用して Aurora DB クラスターに接続するための新しい認証局（CA）証明書を公開しました。ここでは、新しい証明書を使用するためのアプリケーションの更新について説明します。

このトピックでは、クライアントアプリケーションが SSL/TLS を使用して DB クラスターに接続されているかどうかを判断できます。該当する場合はさらに、それらのアプリケーションの接続に証明書の検証が必要かどうかを確認できます。

**注記**  
一部のアプリケーションは、サーバー上の証明書を正常に検証できる場合にのみ、Aurora PostgreSQL DB クラスターに接続されるように設定されています。  
そのようなアプリケーションの場合は、新しい CA 証明書を含むように、クライアントアプリケーションの信頼ストアを更新する必要があります。

クライアントアプリケーションの信頼ストアで CA 証明書を更新した後、DB クラスターで証明書をローテーションできます。これらの手順を開発環境またはステージング環境でテストしてから、本番環境で実装することを強くお勧めします。

証明書のローテーションの詳細については、「[SSL/TLS 証明書のローテーション](UsingWithRDS.SSL-certificate-rotation.md)」を参照してください。証明書のダウンロードの詳細については、[SSL/TLS を使用した DB クラスターへの接続の暗号化](UsingWithRDS.SSL.md) を参照してください。PostgreSQL DB クラスターで SSL/TLS を使用する方法については、「[SSL/TLS での Aurora PostgreSQL データの保護](AuroraPostgreSQL.Security.md#AuroraPostgreSQL.Security.SSL)」を参照してください。

**Topics**
+ [アプリケーションが SSL を使用して Aurora PostgreSQL DB クラスターに接続しているかどうかの確認](#ssl-certificate-rotation-aurora-postgresql.determining-server)
+ [クライアントが接続するために証明書の検証を必要とするかどうかの確認](#ssl-certificate-rotation-aurora-postgresql.determining-client)
+ [アプリケーション信頼ストアの更新](#ssl-certificate-rotation-aurora-postgresql.updating-trust-store)
+ [各種アプリケーションでの SSL/TLS 接続の使用](#ssl-certificate-rotation-aurora-postgresql.applications)

## アプリケーションが SSL を使用して Aurora PostgreSQL DB クラスターに接続しているかどうかの確認
<a name="ssl-certificate-rotation-aurora-postgresql.determining-server"></a>

DB クラスターの設定で `rds.force_ssl` パラメータの値を確認します。デフォルトでは、`rds.force_ssl` パラメータは `0` (オフ) に設定されます。`rds.force_ssl` パラメータが `1` (オン) に設定されている場合、クライアントは接続に SSL/TLS を使用する必要があります。パラメータグループの詳細については、「[Amazon Aurora のパラメータグループ](USER_WorkingWithParamGroups.md)」を参照してください。

`rds.force_ssl` が `1`（オン）に設定されていない場合は、`pg_stat_ssl` ビューにクエリを発行して、SSL を使用する接続を確認します。例えば次のクエリは、SSL 接続、および SSL を使用するクライアントに関する情報のみを返します。

```
select datname, usename, ssl, client_addr from pg_stat_ssl inner join pg_stat_activity on pg_stat_ssl.pid = pg_stat_activity.pid where ssl is true and usename<>'rdsadmin';
```

SSL/TLS 接続を使用する行のみが、接続に関する情報とともに表示されます。以下は出力例です。

```
 datname  | usename | ssl | client_addr
----------+---------+-----+-------------
 benchdb  | pgadmin | t   | 53.95.6.13
 postgres | pgadmin | t   | 53.95.6.13
(2 rows)
```

上記のクエリでは、クエリ実行時点の接続のみが表示されます。結果が表示されなくても、SSL 接続を使用しているアプリケーションが存在しないわけではありません。それ以降に別の SSL 接続が確立される場合もあります。

## クライアントが接続するために証明書の検証を必要とするかどうかの確認
<a name="ssl-certificate-rotation-aurora-postgresql.determining-client"></a>

psql や JDBC など、クライアントに SSL サポートが設定されている場合、クライアントは初期にデフォルトで SSL を使用してデータベースへの接続を試みます。クライアントが SSL を使用して接続できない場合、SSL を使用しない接続に戻ります。libpq ベースのクライアント (psql など) と JDBC の両方で使用されるデフォルトの `sslmode` モードは、`prefer` に設定されています。サーバー上の証明書が検証されるのは、`sslmode` が `verify-ca` または `verify-full` に設定されて、`sslrootcert` が指定されている場合のみです。証明書が無効な場合は、エラーがスローされます。

`PGSSLROOTCERT` を使用して、`PGSSLMODE` 環境変数で証明書を検証します (`PGSSLMODE` は `verify-ca` または `verify-full` に設定)。

```
PGSSLMODE=verify-full PGSSLROOTCERT=/fullpath/ssl-cert.pem psql -h pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com -U primaryuser -d postgres
```

`sslrootcert` 引数を使用して、接続文字列形式で `sslmode` を使用して証明書を検証します（`sslmode` は `verify-ca` または `verify-full` に設定）。

```
psql "host=pgdbidentifier.cxxxxxxxx.us-east-2.rds.amazonaws.com sslmode=verify-full sslrootcert=/full/path/ssl-cert.pem user=primaryuser dbname=postgres"
```

たとえば前述の例の場合は、無効なルート証明書を使用すると、クライアントで次のようなエラーが表示されます。

```
psql: SSL error: certificate verify failed
```

## アプリケーション信頼ストアの更新
<a name="ssl-certificate-rotation-aurora-postgresql.updating-trust-store"></a>

PostgreSQL アプリケーション信頼ストアの更新については、PostgreSQL ドキュメントの「[Secure TCP/IP Connections with SSL](https://www.postgresql.org/docs/current/ssl-tcp.html)」を参照してください。

**注記**  
信頼ストアを更新するとき、新しい証明書を追加できるだけでなく、古い証明書を保持できます。

### JDBC のアプリケーション信頼ストアの更新
<a name="ssl-certificate-rotation-aurora-postgresql.updating-trust-store.jdbc"></a>

SSL/TLS 接続に JDBC を使用するアプリケーションの信頼ストアを更新できます。

ルート証明書のダウンロードについては、[SSL/TLS を使用した DB クラスターへの接続の暗号化](UsingWithRDS.SSL.md) を参照してください。

証明書をインポートするサンプルスクリプトについては、[証明書を信頼ストアにインポートするためのサンプルスクリプト](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-sample-script) を参照してください。

## 各種アプリケーションでの SSL/TLS 接続の使用
<a name="ssl-certificate-rotation-aurora-postgresql.applications"></a>

以下に、各種アプリケーションでの SSL/TLS 接続の使用に関する情報を示します。
+ **psql**

  接続文字列または環境可変としてオプションを指定することで、クライアントがコマンドラインから呼び出されます。SSL/TLS 接続の場合、関連するオプションは `sslmode` (環境可変 `PGSSLMODE`)、`sslrootcert` (環境可変 `PGSSLROOTCERT`) です。

  オプションの詳細なリストについては、PostgreSQL ドキュメントの「[Parameter Key Words](https://www.postgresql.org/docs/11/libpq-connect.html#LIBPQ-PARAMKEYWORDS)」を参照してください。環境可変の詳細なリストについては、PostgreSQL ドキュメントの「[Environment Variables](https://www.postgresql.org/docs/current/libpq-envars.html)」を参照してください。
+ **pgAdmin**

  このブラウザベースのクライアントは、PostgreSQL データベースに接続するために使用できる使いやすいインターフェイスです。

  接続の設定については、[pgAdmin のドキュメント](https://www.pgadmin.org/docs/pgadmin4/latest/server_dialog.html)を参照してください。
+ **JDBC**

  JDBC は、Java アプリケーションとのデータベース接続を可能にします。

  JDBC を使用した PostgreSQL データベースへの接続に関する一般情報については、PostgreSQL ドキュメントの「[Connecting to the Database](https://jdbc.postgresql.org/documentation/use/)」を参照してください。SSL/TLS を使用した接続については、PostgreSQL ドキュメントの「[Configuring the client](https://jdbc.postgresql.org/documentation/ssl/)」を参照してください。
+ **Python**

  PostgreSQL データベースに接続するために一般的に使用される Python ライブラリは、`psycopg2` です。

  `psycopg2` の使用については、[psycopg2 のドキュメント](https://pypi.org/project/psycopg2/)を参照してください。PostgreSQL データベースへの接続方法に関する簡単なチュートリアルについては、「[Psycopg2 Tutorial](https://wiki.postgresql.org/wiki/Psycopg2_Tutorial)」を参照してください。connect コマンドで受け入れられるオプションについては、「[The psycopg2 module content](https://www.psycopg.org/docs/module.html)」を参照してください。

**重要**  
データベース接続で SSL/TLS を使用することを決定し、アプリケーションの信頼ストアを更新したら、rds-ca-rsa2048-g1 証明書を使用するようにデータベースを更新できます。ステップについては、「[DB インスタンスの変更による CA 証明書の更新](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-updating)」のステップ 3 を参照してください。