

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

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

自 2023 年 1 月 13 日起，Amazon RDS 已發佈新的憑證認證機構 (CA) 憑證，使用 Secure Socket Layer 或 Transport Layer Security (SSL/TLS) 來連線至 RDS 資料庫執行個體。接下來，您可以找到更新應用程式使用新憑證的相關資訊。

本主題可協助您判斷任何用戶端應用程式是否使用 SSL/TLS 連線至您的資料庫執行個體。若是如此，您可以進一步檢查那些應用程式是否需要驗證憑證才能連線。

**注意**  
有些應用程式設定為只有在成功驗證伺服器上的憑證時，才能連線至 MySQL 資料庫執行個體。對於這些應用程式，您必須更新用戶端應用程式信任存放區來包含新的 CA 憑證。  
您可以指定下列 SSL 模式：`disabled`、`preferred` 及 `required`。當您使用 `preferred` SSL 模式且 CA 憑證不存在或不是最新版本時，連線會回退至不使用 SSL 且不加密的狀況下進行連線。  
我們建議您避免使用 `preferred` 模式。在 `preferred` 模式中，如果連線遇到無效憑證，則會停止使用加密並繼續使用未加密連線。

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

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

**Topics**
+ [判斷任何應用程式是否使用 SSL 連線至 MySQL 資料庫執行個體](#ssl-certificate-rotation-mysql.determining-server)
+ [判斷用戶端是否需要驗證憑證才能連線](#ssl-certificate-rotation-mysql.determining-client)
+ [更新應用程式信任存放區](#ssl-certificate-rotation-mysql.updating-trust-store)
+ [建立 SSL 連線的 Java 程式碼範例](#ssl-certificate-rotation-mysql.java-example)

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

如果您使用 Amazon RDS for MySQL 5.7、8.0 或 8.4 版，且效能結構描述已啟用，請執行下列查詢，以檢查連線是否使用 SSL/TLS。如需啟用效能結構描述的資訊，請參閱 MySQL 文件中的[效能結構描述快速入門](https://dev.mysql.com/doc/refman/8.0/en/performance-schema-quick-start.html)。

```
mysql> SELECT id, user, host, connection_type 
       FROM performance_schema.threads pst 
       INNER JOIN information_schema.processlist isp 
       ON pst.processlist_id = isp.id;
```

在此輸出範例中，可看到您自己的工作階段 (`admin`) 和以 `webapp1` 登入的應用程式都使用 SSL。

```
+----+-----------------+------------------+-----------------+
| id | user            | host             | connection_type |
+----+-----------------+------------------+-----------------+
|  8 | admin           | 10.0.4.249:42590 | SSL/TLS         |
|  4 | event_scheduler | localhost        | NULL            |
| 10 | webapp1         | 159.28.1.1:42189 | SSL/TLS         |
+----+-----------------+------------------+-----------------+
3 rows in set (0.00 sec)
```

## 判斷用戶端是否需要驗證憑證才能連線
<a name="ssl-certificate-rotation-mysql.determining-client"></a>

您可以檢查 JDBC 用戶端和 MySQL 用戶端是否需要驗證憑證才能連線。

### JDBC
<a name="ssl-certificate-rotation-mysql.determining-client.jdbc"></a>

以下 MySQL Connector/J 8.0 範例指出一種方式來檢查應用程式的 JDBC 連線屬性，以判斷是否需要有效憑證才能成功連線。如需 MySQL 的所有 JDBC 連線選項的詳細資訊，請參閱 MySQL 文件中的[組態屬性](https://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html)。

使用 MySQL Connector/J 8.0 時，如果連線屬性的 `sslMode` 設定為 `VERIFY_CA` 或 `VERIFY_IDENTITY`，則需要以資料庫伺服器憑證來驗證 SSL 連線，如下列範例所示。

```
Properties properties = new Properties();
properties.setProperty("sslMode", "VERIFY_IDENTITY");
properties.put("user", DB_USER);
properties.put("password", DB_PASSWORD);
```

**注意**  
如果您使用 MySQL Java Connector v5.1.38 或更高版本，或 MySQL Java Connector v8.0.9 或更高版本來連線至您的資料庫，即使您尚未明確設定應用程式在連線到資料庫時使用 SSL/TLS，這些用戶端驅動程式會預設為使用 SSL/TLS。此外，使用 SSL/TLS 時，它們會執行部分憑證驗證，如果資料庫伺服器憑證已過期，則無法連線。

### MySQL
<a name="ssl-certificate-rotation-mysql.determining-client.mysql"></a>

以下 MySQL 用戶端範例指出兩種方式來檢查指令碼的 MySQL 連線，以判斷是否需要有效憑證才能成功連線。如需 MySQL 用戶端所有連線選項的詳細資訊，請參閱 MySQL 文件中的[加密連線的用戶端組態](https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html#using-encrypted-connections-client-side-configuration)。

使用 MySQL Client 5.7 版或更高版本時，如果您將 `--ssl-mode` 選項指定為 `VERIFY_CA` 或 `VERIFY_IDENTITY`，則需要以伺服器 CA 憑證來驗證 SSL 連線，如下列範例所示。

```
mysql -h mysql-database.rds.amazonaws.com -uadmin -ppassword --ssl-ca=/tmp/ssl-cert.pem --ssl-mode=VERIFY_CA                
```

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

如需為 MySQL 應用程式更新信任存放區的資訊，請參閱 MySQL 文件中的[安裝 SSL 憑證](https://dev.mysql.com/doc/mysql-monitor/8.0/en/mem-ssl-installation.html)。

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

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

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

如果您在應用程式中使用 mysql JDBC 驅動程式，請在應用程式中設定下列屬性。

```
System.setProperty("javax.net.ssl.trustStore", certs);
System.setProperty("javax.net.ssl.trustStorePassword", "password");
```

啟動應用程式時，設定下列屬性。

```
java -Djavax.net.ssl.trustStore=/path_to_trust_store/MyTruststore.jks -Djavax.net.ssl.trustStorePassword=my_trust_store_password com.companyName.MyApplication        
```

**注意**  
指定此處所顯示提示以外的密碼，作為安全最佳實務。

## 建立 SSL 連線的 Java 程式碼範例
<a name="ssl-certificate-rotation-mysql.java-example"></a>

下列程式碼範例示範如何使用 JDBC 設定 SSL 連線，以驗證伺服器憑證。

```
public class MySQLSSLTest {
     
        private static final String DB_USER = "username";
        private static final String DB_PASSWORD = "password";
        // This trust store has only the prod root ca.
        private static final String TRUST_STORE_FILE_PATH = "file-path-to-trust-store";
        private static final String TRUST_STORE_PASS = "trust-store-password";
            
        public static void test(String[] args) throws Exception {
            Class.forName("com.mysql.jdbc.Driver");
                    
            System.setProperty("javax.net.ssl.trustStore", TRUST_STORE_FILE_PATH);
            System.setProperty("javax.net.ssl.trustStorePassword", TRUST_STORE_PASS);
            
            Properties properties = new Properties();
            properties.setProperty("sslMode", "VERIFY_IDENTITY");
            properties.put("user", DB_USER);
            properties.put("password", DB_PASSWORD);
            
     
            Connection connection = null;
            Statement stmt = null;
            ResultSet rs = null;
            try {
                connection = DriverManager.getConnection("jdbc:mysql://mydatabase.123456789012.us-east-1.rds.amazonaws.com:3306",properties);
                stmt = connection.createStatement();
                rs=stmt.executeQuery("SELECT 1 from dual");
            } finally {
                if (rs != null) {
                    try {
                        rs.close();
                    } catch (SQLException e) {
                    }
                }
                if (stmt != null) {
                   try {
                        stmt.close();
                    } catch (SQLException e) {
                   }
                }
                if (connection != null) {
                    try {
                        connection.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }
    }
```

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