保护 C MQI 和 JMS 程序中的应用程序连接
本文档涵盖了如何使用“C MQI”和“JMS”应用程序安全地连接到 MQ on Cloud 队列管理器。 您需要在先决条件步骤中下载的应用程序用户名和密码。 您还需要针对操作系统的 MQ 客户机,这可能是完整 MQ 安装的一部分,或者可以从 此处单独下载。
先决条件
- 要建立与 MQ on Cloud 队列管理器的安全连接,必须先在 MQ 通道上设置 TLS 加密。 请参阅在 MQ on Cloud 中为 MQ 通道启用 TLS 安全性。
- 如果您不熟悉如何将应用程序连接到 MQ on Cloud 队列管理器,请参阅以下文档:将样本应用程序连接到队列管理器。
- 要将 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。
导出必需的环境变量
- 打开命令行界面并浏览至 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
。
- 其位置将取决于您的操作系统-它将是
- 设置
MQSSLKEYR
环境变量,这是从系统根目录到密钥库文件的完整路径。 请注意,文件名无需后缀 - 因此对于名为 key.kdb 的密钥库,仅指定“key”。- 对于 Windows,运行
set MQSSLKEYR=c:\mystore\key
- 对于 Mac 或 Linux,
export MQSSLKEYR=/Users/you/store/key
- 对于 Windows,运行
- 可以通过以下两种方法之一来设置 CCDT 文件的路径:
- 设置环境变量
MQCCDTURL
,这是从系统根目录到先前向其添加了 cipherSpecification 的 ccdt 文件的文件路径。- 对于 Windows,运行
set MQCCDTURL=c:\mydefinitions\connection_info_ccdt.json
- 对于 Mac 或 Linux,运行
export MQCCDTURL=file:///Users/you/definitions/connection_info_ccdt.json
- 对于 Windows,运行
- 设置环境变量
MQCHLLIB
和MQCHLTAB
。MQCHLLIB
是 ccdt 文件目录的完整路径,MQCHLTAB
是先前向其添加 cipherSpecification 的 ccdt 文件的文件名。- 对于 Windows ,运行
set MQCHLLIB=c:\mydefinitions
和set MQCHLTAB=connection_info_ccdt.json
- 对于 Mac 或 Linux,运行
export MQCHLLIB=/Users/you/definitions
和export MQCHLTAB=connection_info_ccdt.json
- 对于 Windows ,运行
- 设置环境变量
- 设置
MQSAMP_USER_ID
环境变量,这是要作为连接的用户标识。 对于应用程序,这是先前下载的应用程序凭证名称- 对于 Windows,运行
set MQSAMP_USER_ID=<yourusername>
- 对于 Mac 或 Linux,
export MQSAMP_USER_ID=<yourusername>
- 对于 Windows,运行
- 确保未通过运行
unset MQSERVER
来设置MQSERVER
环境变量 - 运行样本
amqsputc
,指定队列名称和队列管理器名称,例如:amqsputc DEV.QUEUE.1 QM1
- 输入正在使用的应用程序凭证的密码
- 当命令行上显示 'target queue is DEV.QUEUE.1' 消息时,说明已准备好发送消息:
- 输入消息数据/字符串,准备就绪时按 "ENTER" 以发送消息。
- 空字符串 "ENTER" 将结束样本。
- 您可以使用
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 样本时,您需要将其更改为接受密码规范:
- 更新 MQ JMS 样本以建立安全连接:
- 浏览至 MQ JMS 样本目录。 该目录的位置将根据您的操作系统而变化。 缺省情况下,该目录将为 $MQ_INSTALLATION_PATH/samp/jms/samples(在 Linux 上)和 %MQ_INSTALLATION_PATH%\tools\jms\samples(在 Windows 上)。
- 使用任何编辑器来打开 simple/JmsPut.java 程序。
- 在创建 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);
- 属性 keyStore 应该是您在 在 MQ on Cloud 中为 MQ 通道启用 TLS 安全性 中创建的密钥库的完整路径
- 客户机端的密码规范可以是任何 TLS 1.2 规范,但建议您将其设置为 ANY_TLS12_OR_HIGHER。
- 查找从 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");
- 保存并关闭编辑器。
- 编译并运行 JMS 样本:
- 打开命令行界面以在步骤中使用。
- 如果尚未执行此操作,请更新系统类路径以包含 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;
- 浏览至 $MQ_INSTALLATION_PATH/samp/jms/samples 并运行
javac simple/JmsPut.java
- 运行 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