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.kdbkey.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应用