2

我可以使用我的 Linux 机器上安装的 MQ 客户端 v9 通过 Pymqi 连接到 IBM mq。需要通过 SSL 连接。我应该如何为双向 TLS(mTLS)创建密钥存储库?

4

1 回答 1

6

我已经配置了一个 python 应用程序之间的相互 tls,该应用程序使用带有用于 MacOS 的 IBM MQ 工具包(9.1.5.0) 支持的 PyMQI 和在Raspberry Pi (9.2.0.0)上运行的队列管理器。

我使用了自签名证书,以便更轻松地说明使用 MQ 的 TLS 配置的端到端示例。这通常不会在生产环境中使用;您的 MQ 管理员通常会提供您可能需要使用的任何证书,这些证书通常由证书颁发机构颁发。在这种情况下,您可以跳过下面的证书创建步骤。

以下是我采取的步骤:

初始服务器和 Python 代码设置

  • 按照提供默认开发人员配置的本教程设置 IBM MQ 服务器。

  • 从本教程中提取 python 示例代码并在DEV.QUEUE.1未配置 TLS的情况下发送消息。

通用配置

  • 在我的 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
    

    “-”表示此密钥库中客户端的私钥和个人证书。

  • 提取队列管理器的公钥。

    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
    
  • 提取客户端的公钥。
    runmqakm -cert -extract -label ibmwebspheremq<userName_lowercase> -db client.kdb -stashed -file Client.cert
    
  • 可以选择通过修改先前runmqakm -cert -list服务器步骤中的先前命令来检查证书。

交换公钥

  • 使用队列管理器的公钥填充客户端的密钥库。

    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
    

    这 '!' 表明队列管理器的公钥是可信的。

  • 使用客户端的公钥填充队列管理器的密钥库。

    切换到服务器目录。

    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 应用程序。

于 2020-08-11T13:37:49.837 回答