Pymqi - 使用 SSL 连接到 IBM mq
Pymqi - Connecting to IBM mq with SSL
我可以使用 Linux 机器上安装的 MQ 客户端 v9 通过 Pymqi 连接到 IBM mq。需要通过 SSL 连接。我应该如何为双向 TLS(mTLS) 创建密钥存储库?
我已经使用支持 IBM MQ toolkit for MacOS (9.1.5.0) and a queue manager running on a Raspberry Pi (9.2.0.0) 的 PyMQI 在 python 应用程序之间配置了相互 tls。
我使用了 self-signed 证书,以便更轻松地说明使用 MQ 的 TLS 配置的 end-to-end 示例。这通常不会在生产环境中使用;您的 MQ 管理员通常会提供您可能需要使用的任何证书,这些证书通常由证书颁发机构颁发。在这种情况下,您可以跳过下面的证书创建步骤。
以下是我采取的步骤:
初始服务器和Python代码设置
按照 this tutorial 设置 IBM MQ 服务器,它提供默认的开发人员配置。
从 this tutorial 中提取 python 示例代码,并在未配置 TLS 的情况下向 DEV.QUEUE.1
发送消息。
常规配置
- 在我的 Mac 客户端上创建了一些工作目录。
mkdir tlsTest
cd tlsTest
mkdir client
mkdir server
队列管理器配置
创建服务器密钥库。
cd server
runmqakm -keydb -create -db key.kdb -pw <password> -stash
ls
查看key.crl key.kdb key.rdb key.sth
。
检查商店是否为空。
runmqakm -cert -list -db key.kdb -stashed
No certificates were found.
创建服务器证书并将其放入新的密钥库key.kdb
runmqakm -cert -create -db key.kdb -stashed -dn "cn=qm,o=ibm,c=uk" -label ibmwebspheremq<QMName_lowerCase> -type cms
检查证书。
runmqakm -cert -list -db key.kdb -stashed
Certificates found
* default, - personal, ! trusted, # secret key
- ibmwebspheremqqm1
'-'表示此密钥库中的客户端私钥和个人证书。
提取队列管理器的 public 密钥。
runmqakm -cert -extract -label ibmwebspheremq<QMName_lowerCase> -db key.kdb -stashed -file QM.cert
查看证书文件。
ls
QM.cert key.crl key.kdb key.rdb key.sth
检查证书。
runmqakm -cert -details -file QM.cert -stashed
客户端配置
- 切换到客户端目录。
cd ../client
- 创建客户端密钥库。
runmqakm -keydb -create -db client.kdb -pw <password> -stash
- 创建客户端证书并将其放入新的密钥库
client.kdb
。
runmqakm -cert -create -db client.kdb -stashed -dn "cn=pymqi,o=test,c=uk" -label ibmwebspheremq<userName_lowercase> -type cms
- 提取客户端的public密钥。
runmqakm -cert -extract -label ibmwebspheremq<userName_lowercase> -db client.kdb -stashed -file Client.cert
- 可选择通过修改先前服务器步骤中的
runmqakm -cert -list
命令来检查证书。
交换 public 密钥
使用队列管理器的 public 密钥填充客户端的密钥库。
runmqakm -cert -add -label ibmwebspheremq<QMName_lowerCase> -db client.kdb -stashed -file ../server/QM.cert
检查证书。
runmqakm -cert -list -db client.kdb -stashed
Certificates found
* default, - personal, ! trusted, # secret key
! ibmwebspheremqqm1
- ibmwebspheremqapp
'!'显示队列管理器的 public 密钥是可信的。
使用客户端的 public 密钥填充队列管理器的密钥库。
切换到服务器目录。
cd ../server
runmqakm -cert -add -label ibmwebspheremq<userName_lowercase> -db key.kdb -stashed -file ../client/Client.cert
检查证书。
runmqakm -cert -list -db key.kdb -stashed
Certificates found
* default, - personal, ! trusted, # secret key
! ibmwebspheremqapp
- ibmwebspheremqqm1
在队列管理器上配置 TLS
将 key.kdb
和 key.sth
文件从 tlsTest/server
目录移动到队列管理器文件系统上的 /var/mqm/qmgrs/ssl/QM1
目录。
修改 DEV.APP.SVRCONN
通道以接受 TLS 1.2 密码套件。
runmqsc QM1
ALTER CHANNEL(DEV.APP.SVRCONN) CHLTYPE(SVRCONN) SSLCIPH(ANY_TLS12)
刷新队列管理器的安全子系统。
REFRESH SECURITY(*) TYPE(SSL)
TLS 启用了 MQ PyMQI 应用程序
将密码规范和标签添加到 Python 应用程序中并包含 sco 选项。
cd.SSLCipherSpec = b'ANY_TLS12'
sco = pymqi.SCO()
#include file name but not file extension
sco.KeyRepository = b'tlsTest/client/client'
sco.CertificateLabel =b'ibmwebspheremqapp'
更改 qmgr.connect
行以添加 sco
选项。
qmgr.connect_with_options(queue_manager, user=b'app', password=b'<your_password>', cd=cd, sco=sco)
测试Python应用
使用环境变量引用标签和密钥库的替代配置
更改 python 应用以删除标签和密钥库。
#sco = pymqi.SCO()
#sco.KeyRepository = b'tlsTest/client/client'
#sco.CertificateLabel =b'ibmwebspheremqapp'
#qmgr.connect_with_options(queue_manager, user=b'app', password=b'<your_password>', cd=cd, sco=sco)
qmgr.connect_with_options(queue_manager, user=b'app', password=b'<your_password>', cd=cd)
设置环境变量。
export MQSSLKEYR=tlsTest/client/client
export MQCERTLABL=ibmwebspheremqapp
测试Python应用
我可以使用 Linux 机器上安装的 MQ 客户端 v9 通过 Pymqi 连接到 IBM mq。需要通过 SSL 连接。我应该如何为双向 TLS(mTLS) 创建密钥存储库?
我已经使用支持 IBM MQ toolkit for MacOS (9.1.5.0) and a queue manager running on a Raspberry Pi (9.2.0.0) 的 PyMQI 在 python 应用程序之间配置了相互 tls。
我使用了 self-signed 证书,以便更轻松地说明使用 MQ 的 TLS 配置的 end-to-end 示例。这通常不会在生产环境中使用;您的 MQ 管理员通常会提供您可能需要使用的任何证书,这些证书通常由证书颁发机构颁发。在这种情况下,您可以跳过下面的证书创建步骤。
以下是我采取的步骤:
初始服务器和Python代码设置
按照 this tutorial 设置 IBM MQ 服务器,它提供默认的开发人员配置。
从 this tutorial 中提取 python 示例代码,并在未配置 TLS 的情况下向
DEV.QUEUE.1
发送消息。
常规配置
- 在我的 Mac 客户端上创建了一些工作目录。
mkdir tlsTest cd tlsTest mkdir client mkdir server
队列管理器配置
创建服务器密钥库。
cd server
runmqakm -keydb -create -db key.kdb -pw <password> -stash
ls
查看
key.crl key.kdb key.rdb key.sth
。检查商店是否为空。
runmqakm -cert -list -db key.kdb -stashed
No certificates were found.
创建服务器证书并将其放入新的密钥库
key.kdb
runmqakm -cert -create -db key.kdb -stashed -dn "cn=qm,o=ibm,c=uk" -label ibmwebspheremq<QMName_lowerCase> -type cms
检查证书。
runmqakm -cert -list -db key.kdb -stashed
Certificates found * default, - personal, ! trusted, # secret key - ibmwebspheremqqm1
'-'表示此密钥库中的客户端私钥和个人证书。
提取队列管理器的 public 密钥。
runmqakm -cert -extract -label ibmwebspheremq<QMName_lowerCase> -db key.kdb -stashed -file QM.cert
查看证书文件。
ls
QM.cert key.crl key.kdb key.rdb key.sth
检查证书。
runmqakm -cert -details -file QM.cert -stashed
客户端配置
- 切换到客户端目录。
cd ../client
- 创建客户端密钥库。
runmqakm -keydb -create -db client.kdb -pw <password> -stash
- 创建客户端证书并将其放入新的密钥库
client.kdb
。runmqakm -cert -create -db client.kdb -stashed -dn "cn=pymqi,o=test,c=uk" -label ibmwebspheremq<userName_lowercase> -type cms
- 提取客户端的public密钥。
runmqakm -cert -extract -label ibmwebspheremq<userName_lowercase> -db client.kdb -stashed -file Client.cert
- 可选择通过修改先前服务器步骤中的
runmqakm -cert -list
命令来检查证书。
交换 public 密钥
使用队列管理器的 public 密钥填充客户端的密钥库。
runmqakm -cert -add -label ibmwebspheremq<QMName_lowerCase> -db client.kdb -stashed -file ../server/QM.cert
检查证书。
runmqakm -cert -list -db client.kdb -stashed
Certificates found * default, - personal, ! trusted, # secret key ! ibmwebspheremqqm1 - ibmwebspheremqapp
'!'显示队列管理器的 public 密钥是可信的。
使用客户端的 public 密钥填充队列管理器的密钥库。
切换到服务器目录。
cd ../server
runmqakm -cert -add -label ibmwebspheremq<userName_lowercase> -db key.kdb -stashed -file ../client/Client.cert
检查证书。
runmqakm -cert -list -db key.kdb -stashed
Certificates found * default, - personal, ! trusted, # secret key ! ibmwebspheremqapp - ibmwebspheremqqm1
在队列管理器上配置 TLS
将
key.kdb
和key.sth
文件从tlsTest/server
目录移动到队列管理器文件系统上的/var/mqm/qmgrs/ssl/QM1
目录。修改
DEV.APP.SVRCONN
通道以接受 TLS 1.2 密码套件。runmqsc QM1
ALTER CHANNEL(DEV.APP.SVRCONN) CHLTYPE(SVRCONN) SSLCIPH(ANY_TLS12)
刷新队列管理器的安全子系统。
REFRESH SECURITY(*) TYPE(SSL)
TLS 启用了 MQ PyMQI 应用程序
将密码规范和标签添加到 Python 应用程序中并包含 sco 选项。
cd.SSLCipherSpec = b'ANY_TLS12' sco = pymqi.SCO() #include file name but not file extension sco.KeyRepository = b'tlsTest/client/client' sco.CertificateLabel =b'ibmwebspheremqapp'
更改
qmgr.connect
行以添加sco
选项。qmgr.connect_with_options(queue_manager, user=b'app', password=b'<your_password>', cd=cd, sco=sco)
测试Python应用
使用环境变量引用标签和密钥库的替代配置
更改 python 应用以删除标签和密钥库。
#sco = pymqi.SCO() #sco.KeyRepository = b'tlsTest/client/client' #sco.CertificateLabel =b'ibmwebspheremqapp' #qmgr.connect_with_options(queue_manager, user=b'app', password=b'<your_password>', cd=cd, sco=sco) qmgr.connect_with_options(queue_manager, user=b'app', password=b'<your_password>', cd=cd)
设置环境变量。
export MQSSLKEYR=tlsTest/client/client export MQCERTLABL=ibmwebspheremqapp
测试Python应用