IBM Cloud Docs
保护 C MQI 和 JMS 程序中的应用程序连接

保护 C MQI 和 JMS 程序中的应用程序连接

本文档涵盖了如何使用“C MQI”和“JMS”应用程序安全地连接到 MQ on Cloud 队列管理器。 您需要在先决条件步骤中下载的应用程序用户名和密码。 您还需要针对操作系统的 MQ 客户机,这可能是完整 MQ 安装的一部分,或者可以从 此处单独下载。

先决条件

  1. 要建立与 MQ on Cloud 队列管理器的安全连接,必须先在 MQ 通道上设置 TLS 加密。 请参阅在 MQ on Cloud 中为 MQ 通道启用 TLS 安全性
  2. 如果您不熟悉如何将应用程序连接到 MQ on Cloud 队列管理器,请参阅以下文档:将样本应用程序连接到队列管理器
  3. 要将 JSON CCDT 定义用于应用程序,您必须具有客户机的 9.1.2(或更高版本)安装。

特定于 C MQI 程序的任务

更改客户机通道定义表 (CCDT)

作为先决条件的一部分,您先前下载了 JSON CCDT 队列管理器描述。 缺省情况下,该描述不包含与通道关联的密码规范,因此您现在必须通过为每个通道添加一个 transmissionSecurity 定义来添加密码规范。

例如:

"channel": [
  {
  "name": "CLOUD.ADMIN.SVRCONN",
  "clientConnection": {
    "connection": [
    {
      "host": "myqueuemanager.qm2.us-south.mq.appdomain.cloud",
      "port": 31500
    }
    ],
    "queueManager": "MQ_TEST_ONE"
  },
  "transmissionSecurity": {
    "cipherSpecification": "SSL_RSA_WITH_AES_128_CBC_SHA256",
  },
  "type": "clientConnection"
  },

客户机端的密码规范已指定为 SSL_RSA_WITH_AES_128_CBC_SHA256。 它可以是任何 TLS 1.2 密码规范,因为服务器端设置为接受 ANY_TLS12_OR_HIGHER

导出必需的环境变量

  1. 打开命令行界面并浏览至 MQ C Samples 目录。
    • 其位置将取决于您的操作系统-它将是 /var/mqm/Tools/Samples/C (Linux) , C:\Program Files\IBM\MQ\Tools\c\Samples (Windows) 或 Mac 上已安装工具箱的位置,例如 ~/mytoolkit/IBM-MQ-Toolkit-Mac-x64-9.1.2.0/samp/bin
  2. 设置 MQSSLKEYR 环境变量,这是从系统根目录到密钥库文件的完整路径。 请注意,文件名无需后缀 - 因此对于名为 key.kdb 的密钥库,仅指定“key”。
    • 对于 Windows,运行 set MQSSLKEYR=c:\mystore\key
    • 对于 Mac 或 Linux, export MQSSLKEYR=/Users/you/store/key
  3. 可以通过以下两种方法之一来设置 CCDT 文件的路径:
    1. 设置环境变量 MQCCDTURL,这是从系统根目录到先前向其添加了 cipherSpecification 的 ccdt 文件的文件路径。
      • 对于 Windows,运行 set MQCCDTURL=c:\mydefinitions\connection_info_ccdt.json
      • 对于 Mac 或 Linux,运行 export MQCCDTURL=file:///Users/you/definitions/connection_info_ccdt.json
    2. 设置环境变量 MQCHLLIBMQCHLTABMQCHLLIB 是 ccdt 文件目录的完整路径, MQCHLTAB 是先前向其添加 cipherSpecification 的 ccdt 文件的文件名。
      • 对于 Windows ,运行 set MQCHLLIB=c:\mydefinitionsset MQCHLTAB=connection_info_ccdt.json
      • 对于 Mac 或 Linux,运行 export MQCHLLIB=/Users/you/definitionsexport MQCHLTAB=connection_info_ccdt.json
  4. 设置 MQSAMP_USER_ID 环境变量,这是要作为连接的用户标识。 对于应用程序,这是先前下载的应用程序凭证名称
    • 对于 Windows,运行 set MQSAMP_USER_ID=<yourusername>
    • 对于 Mac 或 Linux, export MQSAMP_USER_ID=<yourusername>
  5. 确保未通过运行 unset MQSERVER 来设置 MQSERVER 环境变量
  6. 运行样本 amqsputc,指定队列名称和队列管理器名称,例如:
    amqsputc DEV.QUEUE.1 QM1
    
  7. 输入正在使用的应用程序凭证的密码
  8. 当命令行上显示 'target queue is DEV.QUEUE.1' 消息时,说明已准备好发送消息:
    1. 输入消息数据/字符串,准备就绪时按 "ENTER" 以发送消息。
    2. 空字符串 "ENTER" 将结束样本。
  9. 您可以使用 amqsgetc 来接收发送的消息。
    amqsgetc DEV.QUEUE.1 <YOURQMGRNAME>
    

C MQI 样本程序将使用安全连接来发送/接收消息。

特定于 JMS 程序的任务

如果您不熟悉 JMS 样本程序,那么此处提供了有关如何在不使用 TLS 的情况下安装和运行样本的完整教程: https://developer.ibm.com/learningpaths/ibm-mq-badge/write-run-first-mq-app/

以上样本在 Windows 和 Linux上的 IBM Java 1.8 SDK 上运行。 在本文编写时,我们还尝试了使用 Oracle 1.8 SDK 运行该样本,但无法使连接正常工作 - 存在密码套件不匹配问题。

可以运行 JMS 样本时,您需要将其更改为接受密码规范:

  1. 更新 MQ JMS 样本以建立安全连接:
    1. 浏览至 MQ JMS 样本目录。 该目录的位置将根据您的操作系统而变化。 缺省情况下,该目录将为 $MQ_INSTALLATION_PATH/samp/jms/samples(在 Linux 上)和 %MQ_INSTALLATION_PATH%\tools\jms\samples(在 Windows 上)。
    2. 使用任何编辑器来打开 simple/JmsPut.java 程序。
    3. 在创建 JMS ConnectionFactory 实例之后,将以下新属性添加到 JMS 程序。
      System.setProperty("javax.net.ssl.keyStore", "/Users/you/store/key.kdb");
      System.setProperty("javax.net.ssl.keyStorePassword", "my_store_password");
      
      cf.setStringProperty(WMQConstants.USERID, "Your app user ID");
      cf.setStringProperty(WMQConstants.PASSWORD, "Your APIKEY");
      cf.setStringProperty(WMQConstants.WMQ_SSL_CIPHER_SPEC, "ANY_TLS12_OR_HIGHER");
      cf.setStringProperty(WMQConstants.WMQ_CHANNEL, "CLOUD.APP.SVRCONN");
      cf.setIntProperty(WMQConstants.WMQ_CONNECTION_MODE, WMQConstants.WMQ_CM_CLIENT);
      
    4. 查找从 MQ on Cloud 队列管理器详细信息收集的主机名,端口和队列管理器属性的值,并在 JMS 程序中进行设置,如下所示:
      cf.setStringProperty(WMQConstants.WMQ_HOST_NAME, "Your_Queue_Manager_Host_Name_From_CCDT");
      cf.setIntProperty(WMQConstants.WMQ_PORT, "10305");
      cf.setStringProperty(WMQConstants.WMQ_QUEUE_MANAGER, "Your_Queue_Manager_Name_From_CCDT");
      
    5. 保存并关闭编辑器。
  2. 编译并运行 JMS 样本:
    1. 打开命令行界面以在步骤中使用。
    2. 如果尚未执行此操作,请更新系统类路径以包含 MQ JMS JAR 和 JMS 样本类文件夹。
      On Linux:
      export CLASSPATH=$MQ_INSTALLATION_PATH/java/lib/com.ibm.mqjms.jar:$MQ_INSTALLATION_PATH/samp/jms/samples:
      
      On Windows:
      Set CLASSPATH=%MQ_INSTALLATION_PATH%\java\lib\com.ibm.mqjms.jar;%MQ_INSTALLATION_PATH%\tools\jms\samples;
      
    3. 浏览至 $MQ_INSTALLATION_PATH/samp/jms/samples 并运行 javac simple/JmsPut.java
    4. 运行 JMS 程序 java simple/JmsPut

此 JMS 程序将使用安全连接来发送和接收消息。 输出应该类似于以下内容:

  root@d93d60e4f179:/# java -cp ./com.ibm.mq.allclient-9.0.4.0.jar:./javax.jms-api-2.0.1.jar:. com.ibm.mq.samples.jms.JmsPutGet
  Sent message:

  JMSMessage class: jms_text
  JMSType:          null
  JMSDeliveryMode:  2
  JMSDeliveryDelay: 0
  JMSDeliveryTime:  1563884375664
  JMSExpiration:    0
  JMSPriority:      4
  JMSMessageID:     ID:414d51204d515f65735f663920202020806f355d04ff4924
  JMSTimestamp:     1563884375664
  JMSCorrelationID: null
  JMSDestination:   queue:///DEV.QUEUE.1
  JMSReplyTo:       null
  JMSRedelivered:   false
  JMSXAppID: JmsPutGet (JMS)             
  JMSXDeliveryCount: 0
  JMSXUserID: app1        
  JMS_IBM_PutApplType: 28
  JMS_IBM_PutDate: 20190723
  JMS_IBM_PutTime: 12193624
  Your lucky number today is 633

  Received message:
  Your lucky number today is 633
  SUCCESS