本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
將SSL/TLS與 Amazon 搭配 Db2 資料庫執RDS行個體搭配使用
SSL是業界標準通訊協定,用於保護用戶端與伺服器之間的網路連線。在SSL版本 3.0 之後,名稱已更改為TLS,但我們仍然經常將該協議稱為SSL。Amazon RDS 支援 Db2 資料庫執行個體RDS的 Amazon SSL 加密。使用SSL/TLS,您可以加密應用程式用戶端與用RDS於 Db2 DB 執行個體之間的連線。SSL/TLS支持是在所有 AWS 區域 RDS的 Db2。
若要為 Db2 DB 執行個體啟用SSL/TLS加密,RDS請將 Db2 SSL 選項新增至與資料庫執行個體關聯的參數群組。Amazon 根據 Db2 的要求,RDS使用第二個連接埠進行SSL/TLS連線。這樣做可讓資料庫執行個體和 Db2 用戶端之間同時進行純文字和SSL加密通訊。例如,您可以使用具有純文本通信的端口與其他資源進行通信,VPC同時使用具有 SSL-encrypted 通信的端口與外部的資源進行通信。VPC
建立SSL/TLS連線
若要建立SSL/TLS連線,請選擇憑證授權單位 (CA),為所有人下載憑證服務包 AWS 區域,然後將參數新增至自訂參數群組。
步驟 1:選擇 CA 並下載憑證
選擇一個憑證授權單位 (CA),並為所有人下載憑證套裝軟體 AWS 區域。如需詳細資訊,請參閱使用 SSL/TLS 加密資料庫執行個體或叢集連線。
步驟 2:更新自訂參數群組中的參數
如果您使用的是 Db2 的自帶授權 (BYOL) 模型,請修改您為您IBM Customer ID和您IBM Site ID的. RDS 如果您為 Db2 使用不同RDS的授權模式,請依照程序將參數新增至自訂參數群組。如需詳細資訊,請參閱Amazon RDS for Db2 授權選項。
您無法修改 Db2 DB 執行個體的RDS預設參數群組。因此,您必須建立自訂參數群組、修改它,然後將其附加到您RDS的 Db2 DB 執行個體。如需參數群組的詳細資訊,請參閱 RDSAmazon資料庫執行個體的資料庫參數群。
請使用下表中的參數設定。
參數 |
Value |
DB2COMM |
TCPIP,SSL 或 SSL |
SSL_SVCENAME |
<any port number except the number used for the non-SSL
port> |
Connect 至您的 Db2 資料庫伺服器
連接到 Db2 資料庫伺服器的指示是特定於語言的。
- Java
-
若要使用連線至 Db2 資料庫伺服器 Java
-
下載JDBC驅動程式。如需詳細資訊,請參閱 Sup IBM port 文件中的DB2JDBC驅動程式版本與下載。
-
使用下列內容建立殼層指令碼檔案。此指令碼會將套裝軟體中的所有憑證新增至Java
KeyStore.
確認指令碼中的路徑上是否keytool
存在,以便指令碼可以找到它。如果您使用 Db2 用戶端,您可以找到keytool
下~sqlib/java/jdk64/jre/bin
的。
#!/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,請執行下列命令。Replace (取代) shell_file_name.sh
使用您的 shell 腳本文件的名稱和 password
使用您的Java KeyStore.
./shell_file_name.sh
global-bundle.pem password
truststore.jks
-
若要連線至您的 Db2 伺服器,請執行下列命令。將範例中的下列預留位置取代為適用RDS於 Db2 DB 執行個體的資訊。
-
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
-
若要使用連線至 Db2 資料庫伺服器 Node.js
-
安裝node-ibm_db驅動程式。如需詳細資訊,請參閱說明文件中的在Linux和UNIX系統上安裝 node-ibm_db 驅動程式。IBM Db2
-
根據下列內容建立JavaScript檔案。將範例中的下列預留位置取代為適用RDS於 Db2 DB 執行個體的資訊。
-
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
-
若要使用連線至 Db2 資料庫伺服器 Python
-
創建具有以下內容的Python文件。將範例中的下列預留位置取代為適用RDS於 Db2 DB 執行個體的資訊。
-
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文件。Replace (取代) 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 指令碼,請執行下列命令。Replace (取代) shell_file_name.sh
使用您的 shell 腳本文件的名稱。
./shell_file_name.sh
global-bundle.pem