直接连接到内部部署队列管理器
以下指南说明如何将 IBM MQ on Cloud 队列管理器连接到本地队列管理器,配置 TLS 安全性以及在两个队列管理器之间发送消息。 这适用于已使用轻量套餐,缺省套餐或定制套餐部署队列管理器的用户。 值得注意的是,此处概述的指示信息不适合在保留部署计划下部署的队列管理器。 这是因为与此类部署关联的专用网络配置错综复杂。
以下步骤可帮助您配置两个队列管理器之间的连接,使此连接安全,并能双向发送消息。
-
在 MQ on Cloud 队列管理器中创建队列。
- 用于保存来自连接到传输队列的云应用程序的消息的远程队列。
- 本地队列,用于保存来自内部部署队列管理器请求者通道的响应。
-
创建通道和授权,以允许 MQ On Cloud 队列管理器进行连接。
- 服务器通道-此通道从本地队列管理器接收初始连接,并转发来自传输队列的消息。
- 接收方通道-此通道接收来自本地发送方通道的响应。
-
在内部部署队列管理器中创建队列。
- 本地队列-此队列保存以本地应用程序为目标的消息
- 远程队列 - 此队列连接到传输队列,以保存来自内部部署应用程序且发往云队列管理器的响应。
-
创建通道和授权以连接到 MQ On Cloud 队列管理器。
- 请求者通道 - 此通道对应于连接到本地队列的云上服务器通道。
- 发送方通道 - 此通道对应于云队列管理器上的接收方通道,用于接受来自传输队列的消息,并将其转发到云队列管理器。
-
通过为本地队列管理器提供证书来设置 TLS 安全性,以允许这两个队列管理器之间建立信任关系。
以下记录的步骤涉及如何使用 IBM MQ 在部署在 IBM Cloud 中的应用程序与在内部部署数据中心中运行的应用程序之间安全地传输消息的详细说明,以提供这两个部署之间的可靠安全连接。
准备工作
-
此系统中有两个组件,您需要设置并安装这些组件。
-
在 IBM Cloud 中使用 MQ 服务部署的云托管的队列管理器。 在以下步骤中,这称为 "MyCloudQM"。
- 有关创建队列管理器的指示信息,请遵循 创建队列管理器 指南。
-
将连接到云队列管理器的本地队列管理器。 在以下步骤中,这称为 "ONPREM_QM"。
- 如果尚未部署队列管理器,那么可以在本地运行 IBM MQ 队列管理器容器以测试此队列管理器。 有关创建一个队列的指示信息,请遵循 get a IBM MQ queue for development in a container 教程。
-
有关队列管理器管理过程的指导信息,请参阅 队列管理器管理选项
-
-
获取云队列管理器的连接详细信息,以供以后使用,如下所示:
-
在 IBM Cloud 服务控制台中登录到服务实例
-
单击列表中表示队列管理器的行以查看其详细信息
-
单击“连接信息”按钮,然后从生成的对话框中选择 "JSON CCDT"
-
保存 JSON 文件以供以后使用
尤其重要的是,记录已下载的连接详细信息中的队列管理器名称,主机名和侦听器端口,因为您将在以下部分中使用它们。
-
-
获取云队列管理器的公共队列管理器证书,以供以后使用,如下所示:
-
在 IBM Cloud 服务控制台中登录到服务实例
-
单击列表中表示队列管理器的行以查看其详细信息
-
单击 密钥库 选项卡,然后单击缺省 qmgrcert。 单击汉堡符号,然后单击 下载公用证书
-
配置队列管理器
内部部署队列管理器
请务必注意,以下指南中提供的方案假定内部部署队列管理器无法由云队列管理器 (MyCloudQM) 直接联系,因为它没有可公开访问的 IP 地址。 必须将传统的“发送方-接收方”通道替换为“请求者-服务器”通道。
-
打开两个命令提示,一个用于本地队列管理器,另一个用于云队列管理器
-
连接到内部部署队列管理器。 运行 runmqsc 以连接到远程队列管理器,并通过 ping 队列管理器来确认您已成功连接
runmqsc PING QMGR
-
在内部部署队列管理器中创建队列。
DEFINE QLOCAL(LOCAL) DEFINE QLOCAL(TO.CLOUD) USAGE(XMITQ) DEFINE QREMOTE(LOCAL.REPLY) RNAME(LOCAL.REPLY) RQMNAME('MyCloudQM') XMITQ(TO.CLOUD)
- 本地应用程序将从其中使用的本地队列
- 将用于本地发送方通道的发送队列
- 用于将应答消息路由回云队列管理器的远程队列定义
-
创建通道和授权,以允许 MQ On Cloud 队列管理器进行连接。
-
将连接到云的本地发送方通道
DEFINE CHANNEL(ONPREM.TO.CLOUD) CHLTYPE(SDR) + CONNAME('<HOSTNAME>(<PORT>)') XMITQ(TO.CLOUD) TRPTYPE(TCP)
<HOSTNAME>
-这是 connection_info.ccdt.json 文件中的 "host"<PORT>
-这是 connection_info.ccdt.json 文件中的 "port"
-
将从本地队列管理器中调用的请求者通道
DEFINE CHANNEL(CLOUD.TO.ONPREM) CHLTYPE(RQSTR) + CONNAME('<HOSTNAME>(<PORT>)') TRPTYPE(TCP)
-
-
创建认证记录以允许来自云 QM 的入局连接
SET CHLAUTH(CLOUD.TO.ONPREM) TYPE(QMGRMAP) QMNAME('MyCloudQM') ACTION(ADD) USERSRC(CHANNEL)
-
通过遵循下面针对 onprem queuemanager 的步骤来创建和配置密钥存储库。
-
将目录切换到队列管理器的 "ssl" 目录。 例如,在 Windows 机器上,这通常在
c:\ProgramData\IBM\MQ\qmgrs\<qmname>\ssl
中。 在 Linux 系统上,通常可以在/var/mqm/qmgrs/<qmname>/ssl
中找到该系统。如果您已有 "key.kdb" 文件 (密钥/信任库) 在此目录中,可以跳过下一步。 否则,您现在将使用 "runmqakm" 命令来创建密钥库:runmqakm -keydb -create -db key.kdb -pw passOwrd -type pkcs12 -expire 0 -stash chmod +rw key.kdb
-
创建标签为
ibmmqonpremqm
的自签名证书runmqakm -cert -create -db key.kdb -stashed -dn "CN=LOCALQM O=IBM,C=GB" -label ibmmqonpremqm
-
连接到 runmqsc 并更改
SSLKEYR
属性以指向密钥存储库的路径runmqsc ALTER QMGR SSLKEYR('/var/mqm/qmgrs/ONPREM_QM/ssl/key')
云队列管理器
-
启动命令提示符以使用 runmqsc 配置云队列管理器。
-
将环境变量
MQCCDTURL
和MQSSLKEYR
分别设置为下载的 CCDT 文件和证书的完整路径。-
在 Linux/Mac 上:
unset MQSERVER export MQCCDTURL=<full-path-to-ccdt-file> export MQSSLKEYR=<full-path-to-keydb-file>
-
在 Windows 上:
unset MQSERVER set MQCCDTURL=<full-path-to-ccdt-file> set MQSSLKEYR=<full-path-to-keydb-file>
-
-
使用 runmqsc,使用 MQ 用户名和平台 API 密钥连接到云队列管理器 (从 UI 访问云队列管理器时,会在“管理”选项卡下生成 API 密钥。 收到提示要求密码时,必须提供 api 密钥)
runmqsc -u myusername -c MyCloudQM
-
通过执行命令确认您已成功连接
runmqsc PING QMGR
-
在云队列管理器中创建队列
DEFINE QLOCAL(TO.ONPREM) USAGE(XMITQ) DEFINE QREMOTE(LOCAL) RNAME(LOCAL) RQMNAME(ONPREM_QM) XMITQ(TO.ONPREM) DEFINE QLOCAL(LOCAL.REPLY)
- 将用于云发送方通道的传输队列
- 允许将消息发送到本地队列的远程队列定义
- 将用于保存来自本地应用程序的应答消息的本地队列
-
创建通道和授权以允许内部部署队列管理器连接
-
将响应本地请求者通道的服务器通道
DEFINE CHANNEL(CLOUD.TO.ONPREM) CHLTYPE(SVR) XMITQ(TO.ONPREM) TRPTYPE(TCP)
-
用于接受来自本地发送方通道的连接的接收方通道
DEFINE CHANNEL(ONPREM.TO.CLOUD) CHLTYPE(RCVR) TRPTYPE(TCP)
-
-
创建通道认证记录以允许来自本地 QM 发送方和本地 QM 请求者通道的入局连接
SET CHLAUTH(ONPREM.TO.CLOUD) TYPE(QMGRMAP) QMNAME(ONPREM_QM) ACTION(ADD) USERSRC(CHANNEL) SET CHLAUTH(CLOUD.TO.ONPREM) TYPE(QMGRMAP) QMNAME(ONPREM_QM) ACTION(ADD) USERSRC(CHANNEL)
配置 TLS 安全性
-
云队列管理器已配置有缺省服务器证书 (由 Let 's Encrypt 颁发的通配符证书),因此您需要将该服务器证书下载到本地机器并配置队列管理器以信任该证书。
-
在 onprem 队列管理器中,将目录切换到队列管理器的 "ssl" 目录中。 接下来,添加先前下载的云公用证书。 标签应该为
ibmmq<qmname>
-其中qmname
是云队列管理器的名称 (小写)。runmqakm -cert -add -db key.kdb -stashed -label ibmmqmycloudqm -file <path_to_cert>\qmgrcert.pem
-
通过运行以下命令来验证您的证书是否存在:
runmqakm -cert -list -db key.kdb -stashed
-
通过为本地队列管理器提供证书来设置 TLS 安全性,以允许这两个队列管理器之间建立信任关系。
-
本地队列管理器
runmqsc ALTER CHL('ONPREM.TO.CLOUD') CHLTYPE(SDR) SSLCIPH(ANY_TLS12_OR_HIGHER) ALTER CHL('CLOUD.TO.ONPREM') CHLTYPE(RQSTR) SSLCIPH(ANY_TLS12_OR_HIGHER) SSLCAUTH(OPTIONAL)
-
云队列管理器
runmqsc ALTER CHL('ONPREM.TO.CLOUD') CHLTYPE(RCVR) SSLCIPH(ANY_TLS12_OR_HIGHER) SSLCAUTH(OPTIONAL) ALTER CHL('CLOUD.TO.ONPREM') CHLTYPE(SVR) SSLCIPH(ANY_TLS12_OR_HIGHER) SSLCAUTH(OPTIONAL)
-
启用相互认证 TLS 安全性
在此部分中,您将采用上面定义的支持服务器认证 TLS 的通道,并对它们进行更改以启用两个队列管理器之间的相互认证。为了实现此目的,您需要将云上队列管理器配置为“信任”将由内部部署队列管理器提供的服务器证书,反之亦然。
-
如果在设置密钥存储库时尚未为内部部署队列管理器创建自签名证书,请使用
runmqakm
创建证书。 请注意,该命令应该全部位于一行上,并且标签应该为ibmmq<qmname>
-其中<qmname>
是本地队列管理器的名称 (小写):runmqakm -cert -create -db key.kdb -stashed -dn “CN=LOCALQM,O=IBM,C=GB” -label ibmmqonprem_qm
-
使用 runmqakm 在本地机器上抽取自签名个人证书的公共部分 (请注意,该命令应全部位于一行上):
runmqakm -cert -extract -db key.kdb -stashed -label ibmmqonprem_qm -target <path_to_download_directory>/onpremcert.pem -format ascii -fips
-
现在需要将 "onpremcert.pem" 文件导入到云上队列管理器的可信密钥库中
- 在 Web 浏览器中,转至 IBM Cloud 控制台 并找到 MQ 服务实例。
- 从队列管理器列表中,单击包含队列管理器 (MyCloudQM) 的行以转至其详细信息视图,然后单击“信任库”选项卡。
- 单击“导入证书”,然后单击“浏览文件”,浏览到您在先前步骤中下载的 onpremcert.pem 文件。
- 然后单击“打开”,然后单击“下一步”。 指定要提供给证书的标签 (例如 "ibmmqonprem_qm") 然后单击“保存”。
新导入的证书现在应显示在信任库中的证书列表中,并且应显示为可信证书。
-
返回到为配置云队列管理器而打开的 runmqsc 命令提示符 (或者打开新提示 (如果已关闭))。
-
验证您是否已连接到云队列管理器,并将
SSLCIPH
和SSLCAUTH
设置应用于现有通道。runmqsc DISPLAY QMGR QMNAME ALTER CHL('ONPREM.TO.CLOUD') CHLTYPE(RCVR) SSLCIPH(ANY_TLS12_OR_HIGHER) SSLCAUTH(REQUIRED) ALTER CHL('CLOUD.TO.ONPREM') CHLTYPE(SVR) SSLCIPH(ANY_TLS12_OR_HIGHER) SSLCAUTH(REQUIRED)
-
刷新 SSL 安全性,以便更新当前正在运行的所有 SSL 或 TLS 通道
REFRESH SECURITY TYPE(SSL)
-
-
现在,您需要在本地队列管理器上执行等效步骤。 返回到内部部署队列管理器的原始命令提示符 (或者打开新的命令提示符 (如果已关闭))。
runmqsc DISPLAY QMGR QMNAME ALTER CHL('CLOUD.TO.ONPREM') CHLTYPE(RQSTR) SSLCIPH(ANY_TLS12_OR_HIGHER) SSLCAUTH(REQUIRED) REFRESH SECURITY TYPE(SSL)
-
现在,您已完成配置用于相互认证 TLS 的通道。
验证连接
在此部分中,您将启动已定义的通道,确认它们正在成功运行,并向每个方向发送测试消息以证明消息流。
由于内部部署队列管理器必须启动其与云的出站连接,并且还会触发来自云的入站连接 (通过内部部署请求者通道),因此必须从内部部署队列管理器端启动这两个通道。 返回到本地队列管理器的 runmqsc 会话 (如果已关闭原始队列管理器,请创建新的会话)。
-
检查您是否已附加到本地 QM-它应显示 "ONPREM_QM"
runmqsc DISPLAY QMGR QMNAME
-
启动从内部部署到云队列管理器的发送方通道。
START CHANNEL(ONPREM.TO.CLOUD)
-
等待 15 秒,并检查发送方通道是否显示 STATUS (RUNNING)
DISPLAY CHSTATUS(ONPREM.TO.CLOUD) SSLPEER
-
在本地队列管理器上启动请求者通道
START CHANNEL(CLOUD.TO.ONPREM)
-
等待 15 秒,并检查请求者通道是否显示 STATUS (RUNNING)
DISPLAY CHSTATUS(CLOUD.TO.ONPREM) SSLPEER
这两个通道都应显示 STATUS (RUNNING),并且在每种情况下,SSLPEER 的值都应匹配
测试将消息从云发送到内部部署队列管理器
-
返回到 onprem 队列管理器的命令提示符。 检查本地队列的当前队列深度为零,准备好测试从云到本地的消息传输
runmqsc DISPLAY QSTATUS(LOCAL) CURDEPTH
- 应该显示 CURDEPTH (0)
-
在 IBM Cloud中,转至 MQ on Cloud 服务实例,浏览至队列管理器 "MyCloudQM",然后启动 mq 控制台
-
浏览至左侧导航面板中的“管理”选项卡以进行队列管理器管理。
-
单击“队列”选项卡,并从显示的表中找到名为 "LOCAL" 的远程队列。
-
单击队列的 操作 图标
,然后单击“创建消息”。
-
在“应用程序数据”部分中编写简单消息,然后按“创建”按钮。
-
现在返回到 ONPREM_QM 的 runmqsc 窗口,然后重新运行命令以显示本地队列的队列深度。 您将看到队列深度已增加到 1,这指示消息已成功从云队列管理器传输到本地队列管理器。
测试将消息从内部部署发送到云队列管理器
您将使用 "amqsput" 命令行实用程序连接到 ONPREM_QM 并发送将传输到云队列管理器的测试消息。
-
在“内部部署”虚拟机上打开新的命令提示符,并输入以下 "amqsput" 命令以连接到队列,然后为您的消息输入一些简单文本并按 Enter 键两次 (一次完成消息,第二次退出)
amqsput LOCAL.REPLY ONPREM_QM Hello from on-premises <enter> <enter>
-
现在返回到云队列管理器的 MQ 控制台,然后单击右上角的“刷新”图标 (圆圈中的两个箭头),以观察 LOCAL.REPLY 现在是 1 而不是 0。