

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

# 使用 SSL/TLS 搭配 Amazon RDS for Db2 資料庫執行個體
<a name="Db2.Concepts.SSL"></a>

SSL 是一種產業標準通訊協定，可保護用戶端與伺服器之間的網路連線。SSL 3.0 版之後的名稱已變更為 TLS，但我們通常仍會將通訊協定稱為 SSL。Amazon RDS 可支援在 Amazon RDS for Db2 資料庫執行個體上啟用 SSL 加密。使用 SSL/TLS，您可以加密應用程式用戶端與 RDS for Db2 資料庫執行個體之間的連接。所有 AWS 區域 RDS for Db2 都提供 SSL/TLS 支援。



在與資料庫執行個體相關聯的參數群組中新增 Db2 SSL 選項，就能對 RDS for Db2 資料庫執行個體啟用 SSL/TLS 加密。Amazon RDS 會使用第二個連接埠 (依 Db2 要求) 作為 SSL/TLS 連線用途。如此可讓資料庫執行個體與 Db2 用戶端之間同時進行純文字和 Db2 加密的通訊。例如，您可以使用連接埠搭配純文字通訊與 VPC 內的其他資源通訊，同時使用連接埠搭配 SSL 加密的通訊與 VPC 外部的資源通訊。

**Topics**
+ [建立 SSL/TLS 連線](#db2-creating-ssl-connection)
+ [連線至 Db2 資料庫伺服器](#db2-connecting-to-server-ssl)

## 建立 SSL/TLS 連線
<a name="db2-creating-ssl-connection"></a>

若要建立 SSL/TLS 連線，請選擇憑證授權單位 (CA)、下載所有 的憑證套件 AWS 區域，並將參數新增至自訂參數群組。

### 步驟 1：選擇 CA 並下載憑證
<a name="db2-creating-ssl-connection-prereq"></a>

選擇憑證認證機構 (CA)，並下載所有 AWS 區域的憑證套件。如需詳細資訊，請參閱[使用 SSL/TLS 加密與資料庫執行個體或叢集的連線](UsingWithRDS.SSL.md)。

### 步驟 2：更新自訂參數群組中的參數
<a name="db2-updating-parameters-ssl"></a>

**重要**  
如果您使用 RDS for Db2 的自帶授權 (BYOL) 模型，請修改您為 IBM Customer ID 和 IBM Site ID 建立的自訂參數群組。如果您使用不同的 RDS for Db2 授權模型，則請依照程序將參數新增至自訂參數群組。如需詳細資訊，請參閱[Amazon RDS for Db2 授權選項](db2-licensing.md)。

您無法修改 RDS for Db2 資料庫執行個體的預設參數群組。因此，您必須建立自訂參數群組、加以修改，然後將其連接至 RDS for Db2 資料庫執行個體。如需參數群組的詳細資訊，請參閱 [Amazon RDS 資料庫執行個體的資料庫參數群組](USER_WorkingWithDBInstanceParamGroups.md)。

 使用下表中的參數設定。


| 參數 | Value | 
| --- | --- | 
| DB2COMM | TCPIP,SSL 或 SSL | 
| SSL\$1SVCENAME | <any port number except the number used for the non-SSL port> | 

**更新自訂參數群組中的參數**

1. 執行 [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html) 命令來建立自訂參數群組。

   包含下列必要選項：
   + `--db-parameter-group-name` – 您要建立之參數群組的名稱。
   + `--db-parameter-group-family` – Db2 引擎版本和主要版本。有效值：`db2-se-11-5`、`db2-ae-11.5`。
   + `--description` – 此參數群組的描述。

   如需建立資料庫參數群組的詳細資訊，請參閱[在 Amazon RDS 中建立資料庫參數群組](USER_WorkingWithParamGroups.Creating.md)。

1. 修改您透過執行 [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) 命令所建立的自訂參數群組中的參數。

   包含下列必要選項：
   + `--db-parameter-group-name` – 您所建立的參數群組之名稱。
   + `--parameters` – 參數名稱、值，以及參數更新套用方法的陣列。

   如需修改參數群組的相關詳細資訊，請參閱 [修改 Amazon RDS 中的資料庫參數群組中的參數](USER_WorkingWithParamGroups.Modifying.md)。

1. 將參數群組與您的 RDS for Db2 資料庫執行個體建立關聯。如需詳細資訊，請參閱[將資料庫參數群組與 Amazon RDS 中的資料庫執行個體建立關聯](USER_WorkingWithParamGroups.Associating.md)。

## 連線至 Db2 資料庫伺服器
<a name="db2-connecting-to-server-ssl"></a>

連線至 Db2 資料庫伺服器的指示為特定語言。

------
#### [ Java ]

**使用 Java 連線至 Db2 資料庫伺服器**

1. 下載 JDBC 驅動程式。如需詳細資訊，請參閱 IBM 支援文件中的 [DB2 JDBC 驅動程式版本和下載](https://www.ibm.com/support/pages/db2-jdbc-driver-versions-and-downloads)。

1. 建立包含下列內容的 Shell 指令碼檔案。此指令碼會將套件中的所有憑證新增至 Java KeyStore。
**重要**  
確認 `keytool` 存在於指令碼中的路徑上，以便指令碼可以找到它。如果您使用 Db2 用戶端，則可以在 `~sqlib/java/jdk64/jre/bin` 下找到 `keytool`。

   ```
   #!/bin/bash
   PEM_FILE=$1
   PASSWORD=$2
   KEYSTORE=$3
   # number of certs in the PEM file
   CERTS=$(grep 'END CERTIFICATE' $PEM_FILE| wc -l)
   for N in $(seq 0 $(($CERTS - 1))); do
       ALIAS="${PEM_FILE%.*}-$N"
       cat $PEM_FILE |
       awk "n==$N { print }; /END CERTIFICATE/ { n++ }" |
       keytool -noprompt -import -trustcacerts -alias $ALIAS -keystore $KEYSTORE -storepass $PASSWORD
   done
   ```

1. 若要執行 shell 指令碼，並使用憑證套件將 PEM 檔案匯入 Java KeyStore，請執行下列命令。將 *shell\$1file\$1name.sh* 取代為 shell 指令碼檔案的名稱，並將 *password* 取代為您 Java KeyStore 的密碼。

   ```
    ./shell_file_name.sh global-bundle.pem password truststore.jks
   ```

1. 若要連線至 Db2 伺服器，請執行下列命令。將範例中的下列預留位置取代為您的 RDS for Db2 資料庫執行個體資訊。
   + *ip\$1address* – 資料庫執行個體端點的 IP 位址。
   + *port* – SSL 連線的連接埠號碼。這可以是任何連接埠號碼，但用於非 SSL 連接埠的號碼除外。
   + *database\$1name* – 資料庫執行個體中資料庫的名稱。
   + *master\$1username* – 資料庫執行個體的主要使用者名稱。
   + *master\$1password* – 資料庫執行個體的主要密碼。

   ```
   export trustStorePassword=MyPassword
   java -cp ~/dsdriver/jdbc_sqlj_driver/linuxamd64/db2jcc4.jar \
   com.ibm.db2.jcc.DB2Jcc -url \
   "jdbc:db2://ip_address:port/database_name:\
   sslConnection=true;sslTrustStoreLocation=\
   ~/truststore.jks;\
   sslTrustStorePassword=${trustStorePassword};\
   sslVersion=TLSv1.2;\
   encryptionAlgorithm=2;\
   securityMechanism=7;" \
   -user master_username -password master_password
   ```

------
#### [ Node.js ]

**使用 Node.js 連線至 Db2 資料庫伺服器**

1. 安裝 **node-ibm\$1db** 驅動程式。如需詳細資訊，請參閱 IBM Db2 文件中的[在 Linux 和 UNIX 系統上安裝 node-ibm\$1db 驅動程式](https://www.ibm.com/docs/en/db2/11.5?topic=nodejs-installing-node-db-driver-linux-unix-systems)。

1. 根據下列內容建立 JavaScript 檔案。將範例中的下列預留位置取代為您的 RDS for Db2 資料庫執行個體資訊。
   + *ip\$1address* – 資料庫執行個體端點的 IP 位址。
   + *master\$1username* – 資料庫執行個體的主要使用者名稱。
   + *master\$1password* – 資料庫執行個體的主要密碼。
   + *database\$1name* – 資料庫執行個體中資料庫的名稱。
   + *port* – SSL 連線的連接埠號碼。這可以是任何連接埠號碼，但用於非 SSL 連接埠的號碼除外。

   ```
   var ibmdb = require("ibm_db");
   const hostname = "ip_address";
   const username = "master_username";
   const password = "master_password";
   const database = "database_name";
   const port = "port";
   const certPath = "/root/qa-bundle.pem";
   ibmdb.open("DRIVER={DB2};DATABASE=" + database + ";HOSTNAME=" + hostname + ";UID=" + username + ";PWD=" + password + ";PORT=" + port + ";PROTOCOL=TCPIP;SECURITY=SSL;SSLServerCertificate=" + certPath + ";", function (err, conn){
    if (err) return console.log(err);
    conn.close(function () {
    console.log('done');
    });
   });
   ```

1. 若要執行 JavaScript 檔案，請執行下列命令。

   ```
   node ssl-test.js
   ```

------
#### [ Python ]

**使用 Python 連線至 Db2 資料庫伺服器**

1. 使用下列內容建立 Python 檔案。將範例中的下列預留位置取代為您的 RDS for Db2 資料庫執行個體資訊。
   + *port* – SSL 連線的連接埠號碼。這可以是任何連接埠號碼，但用於非 SSL 連接埠的號碼除外。
   + *master\$1username* – 資料庫執行個體的主要使用者名稱。
   + *master\$1password* – 資料庫執行個體的主要密碼。
   + *database\$1name* – 資料庫執行個體中資料庫的名稱。
   + *ip\$1address* – 資料庫執行個體端點的 IP 位址。

   ```
   import click
   import ibm_db
   import sys
   
   port = port;
   master_user_id = "master_username" # Master id used to create your DB instance
   master_password = "master_password" # Master password used to create your DB instance
   db_name = "database_name" # If not given "db-name'
   vpc_customer_private_ip = "ip_address" # Hosts end points - Customer private IP Addressicert_path = "/root/ssl/global-bundle.pem" # cert path
   
   @click.command()        
   @click.option("--path", help="certificate path")
   def db2_connect(path):
   
       try:
           conn = ibm_db.connect(f"DATABASE={db_name};HOSTNAME={vpc_customer_private_ip};PORT={port};
               PROTOCOL=TCPIP;UID={master_user_id};PWD={master_password};SECURITY=ssl;SSLServerCertificate={path};", "", "")
           try:
               ibm_db.exec_immediate(conn, 'create table tablename (a int);')
               print("Query executed successfully")
           except Exception as e:
               print(e)
           finally:
               ibm_db.close(conn)
               sys.exit(1)
       except Exception as ex:
           print("Trying to connect...")
   
   if __name__ == "__main__":
       db2_connect()
   ```

1. 建立下列 shell 指令碼，以執行您建立的 Python 檔案。將 *python\$1file\$1name.py* 取代為您 Python 指令碼檔案的名稱。

   ```
   #!/bin/bash
   PEM_FILE=$1
   # number of certs in the PEM file
   CERTS=$(grep 'END CERTIFICATE' $PEM_FILE| wc -l)
   
   for N in $(seq 0 $(($CERTS - 1))); do
       ALIAS="${PEM_FILE%.*}-$N"
       cert=`cat $PEM_FILE | awk "n==$N { print }; /END CERTIFICATE/ { n++ }"`
       cat $PEM_FILE | awk "n==$N { print }; /END CERTIFICATE/ { n++ }" > $ALIAS.pem
       python3 <python_file_name.py> --path $ALIAS.pem
       output=`echo $?`
       if [ $output == 1 ]; then
           break
       fi
   done
   ```

1. 若要使用憑證套件匯入 PEM 檔案並執行 shell 指令碼，請執行下列命令。將 *shell\$1file\$1name.sh* 取代為您 shell 指令碼檔案的名稱。

   ```
   ./shell_file_name.sh global-bundle.pem
   ```

------
#### [ Db2 CLP ]

**使用 Db2 CLP 連線至 Db2 資料庫伺服器**

1. 若要使用 Db2 CLP 連線到 Db2 執行個體，您需要可在 [ IBM Fix Central](https://www.ibm.com/support/fixcentral/swg/selectFixes?parent=Security+Systems&product=ibm/Tivoli/IBM+Global+Security+Kit&release=All&platform=All&function=fixId&fixids=8.0.*&source=fc) 下載的 GSKit。若要使用 Db2 CLP，您還需要 IBM Db2 用戶端，您可以從 IBM Support 中的[下載初始版本 11.5 用戶端和驅動程式](https://www.ibm.com/support/pages/download-initial-version-115-clients-and-drivers)下載。

1. 建立金鑰存放區。

   ```
   gsk8capicmd_64 -keydb -create -db "directory/keystore-filename" -pw "changeThisPassword" -type pkcs12 -stash
   ```

1. 將憑證套件匯入金鑰存放區。

   ```
   gsk8capicmd_64 -cert -import -file global-bundle.pem -target directory/keystore-filename> -target_stashed
   ```

1. 更新 Db2 執行個體組態。

   ```
   db2 update dbm cfg using SSL_CLNT_KEYDB keystore-filename SSL_CLNT_STASH keystore stash file immediate
   ```

1. 為節點和資料庫編製目錄。

   ```
   db2 catalog tcpip node ssluse1 REMOTE endpoint SERVER ssl_svcename security ssl
   
   db2 catalog database testdb as ssltest at node ssluse1
   ```

1. 連線至 資料庫。

   ```
   db2 connect to ssltest user username using password
   ```

------