Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅
中国的 Amazon Web Services 服务入门
(PDF)。
对 Amazon RDS for Db2 数据库实例使用 SSL/TLS
SSL 是用于保护客户端和服务器之间的网络连接的行业标准协议。在 SSL 3.0 版之后,此名称已更改为 TLS,但我们通常仍将此协议称为 SSL。Amazon RDS 支持对 Amazon RDS for Db2 数据库实例进行 SSL 加密。使用 SSL/TLS,您可以加密应用程序客户端和 RDS for Db2 数据库实例之间的连接。SSL/TLS 支持在 RDS for Db2 的所有 Amazon Web Services 区域中都可用。
要为 RDS for Db2 数据库实例启用 SSL/TLS 加密,请将 Db2 SSL 选项添加到与该数据库实例关联的参数组中。根据 Db2 的要求,Amazon RDS 使用另一个端口进行 SSL/TLS 连接。这样使数据库实例与 Db2 客户端之间能够同时进行明文通信和 SSL 加密通信。例如,您可以使用用于明文通信的端口与 VPC 内的其他资源通信,同时使用用于 SSL 加密通信的端口与 VPC 外部的资源通信。
创建 SSL/TLS 连接
要创建 SSL/TLS 连接,请选择证书颁发机构(CA),下载适用于所有 Amazon Web Services 区域的证书捆绑包,然后向自定义参数组添加参数。
步骤 1:选择 CA 并下载证书
选择证书颁发机构(CA),然后为所有 Amazon Web Services 区域下载证书捆绑包。有关更多信息,请参阅 使用 SSL/TLS 加密与数据库实例或集群的连接。
步骤 2:更新自定义参数组中的参数
如果您对 RDS for Db2 使用自带许可(BYOL)模型,请修改您为 IBM Customer ID 和 IBM Site ID 创建的自定义参数组。如果您对 RDS for Db2 使用不同的许可模式,请按照此过程将参数添加到自定义参数组。有关更多信息,请参阅 Amazon RDS for Db2 许可选项。
您无法修改 RDS for Db2 数据库实例的默认参数组。因此,您必须创建一个自定义参数组,对其进行修改,然后将其附加到 RDS for Db2 数据库实例。有关参数组的信息,请参阅 Amazon RDS 数据库实例的数据库参数组。
使用下表中的参数设置。
参数 |
值 |
DB2COMM |
TCPIP,SSL 或 SSL |
SSL_SVCENAME |
<any port number except the number used for the non-SSL
port> |
连接到您的 Db2 数据库服务器
连接到 Db2 数据库服务器的说明因语言而异。
- Java
-
使用 Java 连接到 Db2 数据库服务器
-
下载 JDBC 驱动程序。有关更多信息,请参阅 IBM 支持文档中的 DB2 JDBC Driver Versions and Downloads。
-
使用以下内容创建 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
-
要运行 Shell 脚本并将包含证书捆绑包的 PEM 文件导入到 Java KeyStore 中,请运行以下命令。将 shell_file_name.sh
替换为 Shell 脚本文件的名称,并将 password
替换为 Java KeyStore 的密码。
./shell_file_name.sh
global-bundle.pem password
truststore.jks
-
要连接到 Db2 服务器,请运行以下命令。将示例中的以下占位符替换为 RDS for Db2 数据库实例信息。
-
ip_address
– 您的数据库实例端点的 IP 地址。
-
port
– SSL 连接的端口号。这可以是任何端口号,但用于非 SSL 端口的端口号除外。
-
database_name
– 数据库实例中数据库的名称。
-
master_username
– 数据库实例的主用户名。
-
master_password
– 数据库实例的主密码。
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 数据库服务器
-
安装 node-ibm_db 驱动程序。有关更多信息,请参阅 IBM Db2 文档中的 Installing the node-ibm_db driver on Linux and UNIX systems。
-
基于以下内容创建 JavaScript 文件。将示例中的以下占位符替换为 RDS for Db2 数据库实例信息。
-
ip_address
– 您的数据库实例端点的 IP 地址。
-
master_username
– 数据库实例的主用户名。
-
master_password
– 数据库实例的主密码。
-
database_name
– 数据库实例中数据库的名称。
-
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');
});
});
-
要运行 JavaScript 文件,请运行以下命令。
node ssl-test.js
- Python
-
使用 Python 连接到 Db2 数据库服务器
-
创建 Python 文件并输入以下内容。将示例中的以下占位符替换为 RDS for Db2 数据库实例信息。
-
port
– SSL 连接的端口号。这可以是任何端口号,但用于非 SSL 端口的端口号除外。
-
master_username
– 数据库实例的主用户名。
-
master_password
– 数据库实例的主密码。
-
database_name
– 数据库实例中数据库的名称。
-
ip_address
– 您的数据库实例端点的 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()
-
创建以下 Shell 脚本,该脚本将运行您创建的 Python 文件。将 python_file_name.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
-
要导入包含证书捆绑包的 PEM 文件并运行 Shell 脚本,请运行以下命令。将 shell_file_name.sh
替换为您的 Shell 脚本文件的名称。
./shell_file_name.sh
global-bundle.pem