直接连接到内部部署队列管理器
以下指南介绍了如何将 IBM® MQ as a Service 队列管理器连接到内部部署队列管理器、配置 TLS 安全性以及在两个队列管理器之间发送消息。
本主题中的说明假定内部部署队列管理器和 IBM MQ as a Service 队列管理器之间有网络连接。 有关配置专用网络的信息,请参阅专用网络。
以下步骤可帮助您配置两个队列管理器之间的连接,确保连接安全,并能双向发送报文。
- 在 IBM MQ as a Service 队列管理器中创建队列。
- 远程队列用于保存来自云应用程序的消息,该队列与发送队列相连。
- 本地队列,用于保存来自内部部署队列管理器请求者通道的响应。
- 创建允许 IBM MQ as a Service 队列管理器连接的通道和授权。
- 服务器通道--该通道从内部队列管理器接收初始连接,并转发发送队列中的信息。
- 接收通道--该通道接收内部发送通道的响应。
- 在内部部署队列管理器中创建队列。
- 本地队列--该队列保存要发送到本地应用程序的信息
- 远程队列 - 此队列连接到传输队列,以保存来自内部部署应用程序且发往云队列管理器的响应。
- 创建连接到 IBM MQ as a Service 队列管理器的通道和授权。
- 请求者通道 - 此通道对应于连接到本地队列的云上服务器通道。
- 发送方通道 - 此通道对应于云队列管理器上的接收方通道,用于接受来自传输队列的消息,并将其转发到云队列管理器。
- 通过为本地队列管理器提供证书来设置 TLS 安全性,以允许这两个队列管理器之间建立信任关系。
下面的步骤将告诉你如何在部署在云中的应用程序和运行在内部部署数据中心的应用程序之间安全地传输信息,使用 IBM MQ 在两个部署之间提供可靠的安全连接。
准备工作
该系统有两个组件,您需要对其进行设置和安装。
- 使用 IBM MQ 服务部署的云托管队列管理器。 在下面的步骤中,这被称为 "MyCloudQM"。 有关说明,请参阅创建队列管理器指南。
- 将连接到云队列管理器的内部部署队列管理器。 在以下步骤中称为 "ONPREM_QM"。 如果尚未部署队列管理器,可以在本地运行 IBM MQ 队列管理器容器进行测试。 有关如何创建 IBM MQ 队列的说明,请按照 “在容器中获取用于开发的 IBM MQ 队列” 教程进行操作。
有关队列管理器管理程序的指导,请参阅管理队列管理器
获取云队列管理器的连接详细信息,以供以后使用,如下所示:
- 按照 IBM MQ as a Service 入门中的说明导航到 IBM MQ as a Service 用户界面。
- 从队列管理器列表中,单击要连接的队列管理器。
- 单击 " 连接信息 "按钮,并从生成的对话框中选择 JSON CCDT
- 保存 json 文件以备后用
从下载的连接详细信息中记下队列管理器名称、主机名和监听器端口,因为您将在以下章节中使用它们。
获取云队列管理器的公共队列管理器证书供以后使用,如下所示:
- 按照 IBM MQ as a Service 入门中的说明导航到 IBM MQ as a Service 用户界面。
- 从队列管理器列表中,单击要连接的队列管理器。
- 单击 " 密钥存储 "选项卡,找到默认的 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)- 本地队列,内部部署应用程序将从
- 将用于内部发送通道的发送队列
- 远程队列定义用于将回复信息路由回云队列管理器
创建允许 IBM MQ as a Service 队列管理器连接的通道和授权。
- 将连接到云的内部部署发送通道
DEFINE CHANNEL(ONPREM.TO.CLOUD) CHLTYPE(SDR) + CONNAME('<HOSTNAME>(<PORT>)') XMITQ(TO.CLOUD) TRPTYPE(TCP)<HOSTNAME>- 这是文件中的 "host connection_info.ccdt.json<PORT>- 这是文件中的 "端口 connection_info.ccdt.json- 将从内部队列管理器调用的请求者通道
DEFINE CHANNEL(CLOUD.TO.ONPREM) CHLTYPE(RQSTR) + CONNAME('<HOSTNAME>(<PORT>)') TRPTYPE(TCP)
- 创建身份验证记录,允许从云队列管理器传入连接
SET CHLAUTH(CLOUD.TO.ONPREM) TYPE(QMGRMAP) QMNAME('MyCloudQM') ACTION(ADD) USERSRC(CHANNEL) - 按照以下步骤为 onprem 队列管理器创建和配置密钥存储库。
- 将目录更改为队列管理器的 "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>
- Linux 或 Mac :
- 使用 runmqsc 连接到云队列管理器,使用 IBM MQ 用户名和平台 API 密钥(从用户界面访问云队列管理器时,会在管理选项卡下生成 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 的通道,并对其进行更改,以启用两个队列管理器之间的相互身份验证。要实现这一点,您需要配置云上队列管理器 "信任 "由内部队列管理器提供的服务器证书,反之亦然。
- 如果在设置密钥库时尚未为 onprem 队列管理器创建自签名证书,请使用 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 文件导入云上队列管理器的可信密钥存储区
- 按照 IBM MQ as a Service 入门中的说明导航到 IBM MQ as a Service 用户界面。
- 从队列管理器列表中,单击包含队列管理器的行 ( 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(运行中)
DISPLAY CHSTATUS(ONPREM.TO.CLOUD) SSLPEER在内部部署队列管理器上启动请求者通道
START CHANNEL(CLOUD.TO.ONPREM)等待 15 秒,检查请求者通道是否显示 STATUS(运行中)
DISPLAY CHSTATUS(CLOUD.TO.ONPREM) SSLPEER
两个通道都应显示 STATUS(RUNNING),而且 SSLPEER 的值都应符合以下条件
测试从云端向内部部署队列管理器发送信息
- 返回 onprem 队列管理器的命令提示符。 检查本地队列的当前队列深度是否为零,为我们测试从云到本地的报文传输做好准备
runmqsc DISPLAY QSTATUS(LOCAL) CURDEPTH- 应显示 CURDEPTH(0)
- 按照 IBM MQ as a Service 入门中的说明导航到 IBM MQ as a Service 用户界面。
- 导航至队列管理器 'MyCloudQM', 并启动 IBM MQ 控制台
- 单击队列选项卡,从显示的表格中找到名为 "LOCAL "的远程队列。
- 单击队列的操作图标
,然后单击创建信息。 - 在应用程序数据部分编写一条简单的信息,然后按创建按钮。
- 现在返回 ONPREM_QM 的 runmqsc 窗口,重新运行命令以显示本地队列的队列深度。 您将看到队列深度已增至 1,表明消息已成功从云队列管理器传输到内部部署队列管理器。
您将使用 "amqsput "命令行实用程序连接到 ONPREM_QM,并发送测试消息,该消息将被传送到云队列管理器。
测试从内部部署向云队列管理器发送信息
您使用 amqsput 命令行实用程序连接到 ONPREM_QM,并发送测试报文,该报文将传输到云队列管理器。
在 "内部 "虚拟机上打开一个新的命令提示符,输入以下 amqsput 命令连接到队列,然后键入一些简单的信息文本并按两次回车键(一次完成信息,第二次退出)
amqsput LOCAL.REPLY ONPREM_QM Hello from on-premises <enter> <enter>现在回到云队列管理器的 IBM MQ 控制台,单击右上角的刷新图标(圆圈中的两个箭头),观察 LOCAL.REPLY 的队列深度现在是 1,而不是 0。