

# 对 Amazon RDS for Db2 数据库实例使用 SSL/TLS
<a name="Db2.Concepts.SSL"></a>

SSL 是用于保护客户端和服务器之间的网络连接的行业标准协议。在 SSL 3.0 版之后，此名称已更改为 TLS，但我们通常仍将此协议称为 SSL。Amazon RDS 支持对 Amazon RDS for Db2 数据库实例进行 SSL 加密。使用 SSL/TLS，您可以加密应用程序客户端和 RDS for Db2 数据库实例之间的连接。SSL/TLS 支持在 RDS for Db2 的所有 AWS 区域中都可用。



要为 RDS for Db2 数据库实例启用 SSL/TLS 加密，请将 Db2 SSL 选项添加到与该数据库实例关联的参数组中。根据 Db2 的要求，Amazon RDS 使用另一个端口进行 SSL/TLS 连接。这样使数据库实例与 Db2 客户端之间能够同时进行明文通信和 SSL 加密通信。例如，您可以使用用于明文通信的端口与 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)。

 使用下表中的参数设置。


| 参数 | 值 | 
| --- | --- | 
| 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 Driver Versions and Downloads](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 文档中的 [Installing the node-ibm\$1db driver on Linux and UNIX systems](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 实例，您需要使用 GSKit，可从 [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) 下载它。要使用 Db2 CLP，您还需要使用 IBM Db2 客户端，可从 IBM Support 的 [Download initial Version 11.5 clients and drivers](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
   ```

------