

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 更新應用程式使用新的 SSL/TLS 憑證來連線至 PostgreSQL 資料庫執行個體
<a name="ssl-certificate-rotation-postgresql"></a>

用於 Secure Socket Layer 或 Transport Layer Security (SSL/TLS) 的憑證通常具有設定生命週期。當服務供應商更新其憑證授權機構 (CA) 憑證時，用戶端必須更新其應用程式以使用新憑證。您可以在下文找到相關資訊，了解如何判斷用戶端應用程式是否使用 SSL/TLS 連線至 Amazon RDS for PostgreSQL 資料庫執行個體。您還可以找到如何檢查這些應用程式在連線時是否驗證伺服器憑證的相關資訊。

**注意**  
設定為在 SSL/TLS 連線之前驗證伺服器憑證的用戶端應用程式，必須在用戶端的信任存放區中具有有效的 CA 憑證。在需要時更新用戶端信任存放區以取得新憑證。

更新用戶端應用程式信任存放區中的 CA 憑證之後，您就可以在資料庫執行個體輪換憑證。強烈建議先在非生產環境中測試這些步驟，再於生產環境中實作。

如需憑證輪換的詳細資訊，請參閱[輪換您的 SSL/TLS 憑證](UsingWithRDS.SSL-certificate-rotation.md)。如需下載憑證的詳細資訊，請參閱[使用 SSL/TLS 加密與資料庫執行個體或叢集的連線](UsingWithRDS.SSL.md)。如需對 PostgreSQL 資料庫執行個體使用 SSL/TLS 的資訊，請參閱[將 SSL 與 PostgreSQL 資料庫執行個體搭配使用](PostgreSQL.Concepts.General.SSL.md)。

**Topics**
+ [判斷任何應用程式是否使用 SSL 連線至 PostgreSQL 資料庫執行個體](#ssl-certificate-rotation-postgresql.determining-server)
+ [判斷用戶端是否需要驗證憑證才能連線](#ssl-certificate-rotation-postgresql.determining-client)
+ [更新應用程式信任存放區](#ssl-certificate-rotation-postgresql.updating-trust-store)
+ [針對不同類型的應用程式使用 SSL/TLS 連線](#ssl-certificate-rotation-postgresql.applications)

## 判斷任何應用程式是否使用 SSL 連線至 PostgreSQL 資料庫執行個體
<a name="ssl-certificate-rotation-postgresql.determining-server"></a>

在資料庫執行個體組態中檢查 `rds.force_ssl` 參數的值。對於使用 PostgreSQL 版本 15 之前版本的資料庫執行個體，`rds.force_ssl` 參數預設會設定為 `0` (關閉)。對於使用 PostgreSQL 版本 15 及更新主要版本的資料庫執行個體，`rds.force_ssl` 預設會設定為 `1` (開啟)。如果 `rds.force_ssl` 參數設為 `1` (開啟)，則用戶端需要使用 SSL/TLS 進行連線。如需參數群組的詳細資訊，請參閱[Amazon RDS 的參數群組](USER_WorkingWithParamGroups.md)。

如果您使用 RDS PostgreSQL 9.5 版或更新的主要版本，而 `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-postgresql.determining-client"></a>

當用戶端 (例如 psql 或 JDBC) 設有 SSL 支援時，依預設，用戶端會先嘗試以 SSL 連線至資料庫。如果用戶端無法以 SSL 連線，則回復為不以 SSL 來連線。用於 libpq 型用戶端 (例如 psql) 與 JDBC 的預設 `sslmode` 模式設定為 `prefer`。只有當提供 `sslrootcert` 並搭配 `sslmode` 設為 `verify-ca` 或 `verify-full` 時，才會驗證伺服器上的憑證。如果憑證無效，則擲出錯誤。

使用 `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 masteruser -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=masteruser dbname=postgres"
```

例如，在上述案例中，如果您使用無效根憑證，則在用戶端會看到類似以下的錯誤。

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

## 更新應用程式信任存放區
<a name="ssl-certificate-rotation-postgresql.updating-trust-store"></a>

如需為 PostgreSQL 應用程式更新信任存放區的資訊，請參閱 PostgreSQL 文件中的[使用 SSL 保護 TCP/IP 連線的安全](https://www.postgresql.org/docs/current/ssl-tcp.html)。

如需下載根憑證的資訊，請參閱 [使用 SSL/TLS 加密與資料庫執行個體或叢集的連線](UsingWithRDS.SSL.md)。

如需匯入憑證的範例指令碼，請參閱 [將憑證匯入信任存放區的範例指令碼](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-sample-script)。

**注意**  
更新信任存放區時，除了新增憑證，您還可以保留舊憑證。

## 針對不同類型的應用程式使用 SSL/TLS 連線
<a name="ssl-certificate-rotation-postgresql.applications"></a>

以下提供針對不同類型的應用程式使用 SSL/TLS 連線的資訊：
+ **psql**

  以連線字串或環境變數指定選項，從命令列叫用此用戶端。若為 SSL/TLS 連線，相關選項為 `sslmode` (環境變數 `PGSSLMODE`)、`sslrootcert` (環境變數 `PGSSLROOTCERT`)。

  如需完整的選項清單，請參閱 PostgreSQL 文件中的[參數關鍵字](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PARAMKEYWORDS)。如需完整的環境變數清單，請參閱 PostgreSQL 文件中的[環境變數](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 JDBC 驅動程式文件中的[連線至資料庫](https://jdbc.postgresql.org/documentation/use/#connecting-to-the-database)。如需使用 SSL/TLS 來連線的資訊，請參閱 PostgreSQL JDBC 驅動程式文件中的[設定用戶端](https://jdbc.postgresql.org/documentation/ssl/#configuring-the-client)。
+ **Python**

  常用來連線至 PostgreSQL 資料庫的 Python 程式庫是 `psycopg2`。

  如需使用 `psycopg2` 的資訊，請參閱 [psycopg2 文件](https://pypi.org/project/psycopg2/)。如需如何連線至 PostgreSQL 資料庫的簡短教學課程，請參閱 [Psycopg2 教學](https://wiki.postgresql.org/wiki/Psycopg2_Tutorial)。您可以在 [psycopg2 模組內容](http://initd.org/psycopg/docs/module.html#module-psycopg2)中找到 connect 命令接受的選項的相關資訊。

**重要**  
在確定了資料庫連線使用 SSL/TLS 並已更新應用程式信任存放區之後，您可以將資料庫更新為使用 rds-ca-rsa2048-g1 憑證。如需說明，請參閱[透過修改資料庫執行個體或叢集來更新憑證授權機構憑證](UsingWithRDS.SSL-certificate-rotation.md#UsingWithRDS.SSL-certificate-rotation-updating)中的步驟 3。