IBM Cloud Docs
启用队列管理器 Advanced Message Security (AMS)

启用队列管理器 Advanced Message Security (AMS)

什么是 IBM MQ Advanced Message Security?

IBM® MQ Advanced Message Security 扩展了 IBM MQ 安全服务,可在“消息”级别提供加密,以保护敏感数据,例如高价值的财务交易和个人信息。 实现 IBM MQ AMS 有两种方法,我们将其称为应用程序 AMS 和队列管理器 AMS。 本教程重点说明队列管理器 AMS。

队列管理器 AMS 提供以下功能:

  • 全面安全性,无需编写复杂的安全代码,也无需修改或重新编译现有应用程序
  • 支持对消息进行加密和数字签名
  • 公共密钥基础架构 (PKI) 技术,用于为消息提供认证、授权、机密性和数据完整性服务

教程概述

此图显示使用队列管理器 AMS 对存储在队列管理器上的队列上的消息进行加密。

图:队列管理器 AMS 可确保在将消息数据放入队列到检索消息数据之间,消息数据未被修改。

本教程通过网络将纯文本消息传递到队列管理器。 在生产系统中,建议您使用启用 TLS 的通道来保护传输中的消息。

本教程将指导您完成相应步骤来配置队列管理器 AMS,以在 IBM Cloud 队列管理器的 IBM MQ 队列上进行加密。 首先,放入并获取明文消息,以确认位于队列中的消息是明文形式。 然后,启用队列管理器 AMS 加密,从而确保对队列上的消息加密。 然后,证明队列上的消息现在已加密,以确保未经授权的用户或应用程序无法访问或修改消息数据。

先决条件

为了继续执行本教程,请务必确保您满足以下先决条件:

  1. IBM MQ on Cloud 队列管理器

    如果您还没有 IBM MQ on Cloud 队列管理器,那么可以通过遵循此处的引导式教程来创建一个队列管理器:

    IBM MQ on Cloud 入门

    • : 队列管理器应该尚未启用 TLS

    遵循了引导式教程或执行了同一页面上提供的手动步骤后,您应该具有:

    • MQ on Cloud 队列管理器
    • 在 connection_info.txt 文件中下载的连接详细信息
      • 如果没有此文件,请查阅本教程底部的附录 1
    • 在 platformApiKey.json 文件中下载的管理员用户名和 API 密钥
      • 如果没有此文件,请查阅本教程底部的附录 2
    • 在 apiKey.json 文件中下载的应用程序用户名和 API 密钥
      • 如果没有此文件,请查阅本教程底部的附录 3
  2. IBM MQ 客户机

    要完成本教程,您需要 IBM MQ 命令行工具“runmqsc”以及已安装并且位于 PATH 上的 IBM MQ 样本应用程序“amqsputc”和“amqsgetc”。 如果没有这些命令,那么可以通过安装 IBM MQ 客户机来获取这些命令。 本教程末尾的附录 4 详细说明了如何执行此操作。

    • : IBM MQ 客户机仅可用于 WindowsLinux

设置终端环境

  1. 打开 2 个终端窗口

    • 一个终端将是管理终端,用于管理队列管理器
    • 一个终端将是应用程序终端,用于表示连接到队列管理器的应用程序,并执行消息“放入”和“获取”操作
  2. 在管理终端中指定队列管理器详细信息

    稍后将使用的 runmqsc 命令需要设置环境变量,以标识它应该连接到的远程队列管理器。 在管理终端中,使用以下命令导出 MQSERVER 变量:

    • export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
      • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
      • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  3. 在应用程序终端中指定队列管理器详细信息

    稍后将使用的 amqsputcamqsgetc 命令需要设置环境变量,以标识它应该连接到的远程队列管理器。 在 app terminal中,使用以下命令导出 MQSERVER 变量: 在 app terminal中,使用以下命令导出 MQSERVER 变量:

    • export MQSERVER="CLOUD.APP.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
      • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
      • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  4. 指定应用程序用户名

    amqsputcamqsgetc 命令还需要将环境变量设置为它应该使用的特定用户名。 在应用程序终端中,使用以下命令导出 MQSAMP_USER_ID:

    • export MQSAMP_USER_ID="<APP_MQ_USER>"
      • <APP_MQ_USER> -这是 apiKey.json 文件中的 "mqUsername"
  5. 在应用程序终端中禁用应用程序 AMS

    在本教程中,我们将启用队列管理器 AMS。 因此,需要禁用应用程序 AMS(有时称为客户机 AMS),以便只有队列管理器执行 AMS 加密和解密,而客户机不执行。 在应用程序终端中:

    • IBM MQ 客户机 7.5
      • export AMQ_DISABLE_CLIENT_AMS=TRUE
    • IBM MQ 客户机 8.0 和更高版本:
      • export MQS_DISABLE_ALL_INTERCEPT=TRUE

创建目标设定为缺省队列的别名队列

在此部分中,您将创建目标设定为缺省队列的别名队列。 启用了 QM AMS 后,对缺省队列执行“放入”或“获取”操作时,将触发 AMS 拦截器。 因此,尽管消息已在队列上加密,但在检索到该消息时,该消息仍可作为明文读取。 为了证明消息已加密,可以使用别名队列。 通过别名队列检索消息不会触发缺省队列上的拦截器,因此将按原样检索消息而不进行解密,这将准确表明消息是明文还是已加密。

  1. 切换到管理终端
  2. 运行 runmqsc 以连接到远程队列管理器
  • runmqsc -c -u <ADMIN_MQ_USER> -w60 <QUEUE_MANAGER_NAME>
    • <ADMIN_MQ_USER> -这是 platformApiKey.json 文件中的 "mqUsername"
    • <QUEUE_MANAGER_NAME> -这是 connection_info.txt 文件中的 "queueManagerName"
    • -c 使用 MQSERVER 变量通知 runmqsc 应该连接到远程队列管理器
  1. 终端将提示您输入密码
    • This is your <ADMIN_API_KEY> = 'API 密钥' in the file platformApiKey.json
  2. 现在,终端在等待进行输入
  3. 创建目标设定为缺省队列的别名队列
  • DEFINE QALIAS (DEV.ALIAS.QUEUE.1) TARGET (DEV.QUEUE.1)
    • DEV.ALIAS.QUEUE.1 是别名队列的名称
    • DEV.QUEUE.1 是在本教程中使用的缺省队列

显示 "runmqsc" 后跟密码条目和 "DEFINE QALIAS" 命令的图像,用于创建以缺省队列为目标的别名队列

在启用队列管理器 AMS 之前测试别名队列

为了证明别名队列正常工作并且这些消息当前在缺省队列上为明文形式,现在将对缺省队列执行消息“放入”操作,然后对别名队列执行消息“获取”操作。

  1. 切换到应用程序终端
  2. 运行 amqsputc 以将消息放入缺省队列
    • amqsputc DEV.QUEUE.1
  3. 终端将提示您输入密码
    • This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
  4. 现在,终端在等待进行输入。 请输入消息
    • 两次按 Enter key 键以 exit from amqsputc 显示 "amqsputc" 后跟密码条目和缺省队列上的消息条目的图像
  5. 针对别名队列运行 amqsgetc 以从缺省队列中获取消息
    • amqsgetc DEV.ALIAS.QUEUE.1
    • DEV.ALIAS.QUEUE.1 是别名队列的名称
  6. 终端将提示您输入密码
    • This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
  7. 现在,终端将从缺省队列中输出消息

显示 "amqsgetc" 后跟密码条目以及针对缺省队列的别名队列上的消息检索的图像

  • 请注意,消息以明文形式返回,因为这就是消息在缺省队列上的存储方式。

选择要用于 AMS 加密的证书

队列管理器通道必须配置为对消息加密。 MQ on Cloud 随附了 Let 's Encrypt 提供的缺省证书,我们将使用该证书对消息进行加密。 执行以下步骤为队列管理器 AMS 配置队列管理器通道:

  1. 在 IBM Cloud (http://cloud.ibm.com/) 中,找到您在指导教程中创建的 IBM MQ on Cloud 队列管理器。 显示队列管理器列表的图像
  2. 选择 密钥库 选项卡 显示队列管理器密钥库选项卡的图像
  3. 在缺省证书上,单击 3 点 此图显示密钥库中缺省证书的 3 点
  4. 单击 管理 此图显示密钥库中缺省证书的 "管理" 选项卡
  5. 启用 将此证书用于队列管理器 AMS 此图显示用于启用队列管理器 AMS 的缺省证书的开关
  6. 选择应用程序通道 CLOUD。APP.SVRCONN 显示已启用 AMS 的缺省证书的 "选择通道" 的图像 此图显示选择启用 AMS 的缺省应用程序通道
  7. 单击 下一步 该图显示 1 已为已启用 AMS 的缺省证书选择的通道
  8. 阅读警告,然后勾选 我了解 ,然后单击 保存 该图显示了接受将覆盖使用该证书的现有通道的复选框 您现在已对所选通道启用队列管理器 AMS ,并选择了要用于加密的证书 显示 AMS 符号已启用的图像
  9. 单击复制详细信息,并将其粘贴到您选择的文本编辑器。 将此内容另存为 default_cert.txt ,因为您稍后将需要 DN 字段内容。 显示 AMS 符号已启用的图像

创建策略以启用 AMS 加密

现在,将在单个队列上配置安全策略以启用 AMS。 您会看到我们将执行加密,但不会执行签名。 在相关队列上配置安全策略之前,不会执行加密或签名。

  1. 管理终端
  2. 终端应该仍位于 runmqsc 内。 如果不是,请如上面所执行的操作,针对队列管理器运行 runmqsc
  3. 使用以下命令创建策略:
  • SET POLICY (DEV.QUEUE.1) ENCALG (AES256) RECIP ('<SUBJECT_DN>')
    • DEV.QUEUE.1 是在本教程中使用的缺省队列
    • AES256 - 用于本教程的加密。 其他算法可在此处找到
    • <SUBJECT_DN> -这是在 "选择证书" 的最后一步创建的 default_cert.txt 文件中的 "Subject DN"
    • 注释。 将主体 DN 括起的单引号必需的
  1. 通过输入以下命令退出 runmqsc
    • END

显示输入到命令行以设置策略的命令的图像

既然队列管理器 AMS 已启用,接着测试队列

  1. 应用程序终端
  2. 运行 amqsputc 以将消息放入缺省队列
    • amqsputc DEV.QUEUE.1
  3. 终端将提示您输入密码
    • This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
  4. 现在,终端在等待进行输入。 请输入消息
    • 点击 Enter 键两次以退出 amqsputc
  5. 针对别名队列运行 amqsgetc 以从缺省队列中获取消息
    • amqsgetc DEV.ALIAS.QUEUE.1
    • DEV.ALIAS.QUEUE.1 是别名队列的名称
  6. 终端将提示您输入密码
    • This is your <APP_API_KEY> = 'API 密钥' in the file apiKey.json
  7. 现在,终端将从缺省队列中输出加密消息

此图显示此部分中执行的步骤,包括别名队列上 amqsgetc 的输出,显示缺省队列上的加密消息

  • 注:显示的消息不是明文形式。 这是因为消息已在缺省队列上加密。

结论

您现在已经完成了本教程。 您已在队列上启用 IBM MQ AMS,并且已证明这可确保存储在指定队列上的消息已加密。

故障诊断

显示发生错误代码 2063 的图像

  • amqsputc 返回原因码 2035
    • 如果尚未运行 export MQS_DISABLE_ALL_INTERCEPT=TRUE,那么可能会发生此情况
    • 执行“设置终端环境”的最后一步

显示发生错误代码 2035 的图像

附录

附录 1:connection_info.txt

要检索包含队列管理器连接详细信息的 connection_info.txt 文件,请执行以下操作:

  1. 通过单击表中显示的相关服务,登录到 IBM Cloud 服务实例 显示服务实例的图像
  2. 这将打开队列管理器视图。 选择要从中检索连接信息的队列管理器 显示队列管理器列表的图像
  3. 单击 连接信息 队列管理器连接信息的图像
  4. 以“JSON 文本格式”下载此文件

附录 2:platformApiKey.json

要创建或重置管理员 API 密钥,请执行以下操作:

  1. 通过单击表中显示的相关服务,登录到 IBM Cloud 服务实例 显示服务实例的图像
  2. 这将打开队列管理器视图。 选择要从中检索连接信息的队列管理器 显示队列管理器列表的图像
  3. 接下来,选择 管理 选项卡 此图显示突出显示了 "队列管理器管理" 选项卡
  4. 现在,单击重置 IBM Cloud API 密钥
  • 注:此 MQ 用户名的先前管理员 API 密钥将不再有效

此图显示了突出显示的管理 API 密钥重置按钮

  • 注: 如果按钮显示 Create IBM Cloud API Key,那么您以前没有以这种方式创建 API 密钥。 请单击创建 IBM Cloud API 密钥按钮。
  1. 单击 下载 以下载包含管理员用户名和 API 密钥的 platformApiKey.json 此图显示突出显示了管理新 API 密钥的 "下载" 按钮

附录 3:apiKey.json

要创建新的应用程序 API 密钥,请执行以下操作:

  1. 通过单击表中显示的相关服务,登录到 IBM Cloud 服务实例 显示服务实例的图像
  2. 这将打开队列管理器视图。 选择 应用程序凭证 选项卡 此图显示具有 "应用程序" 许可权的队列管理器的列表 (以圆圈表示)
  3. 现在,单击将用于 AMS 教程的应用程序旁边的 3 点 此图显示当前设置的应用程序许可权列表
  4. 单击添加新的 API 密钥
  • 注释。 现有应用程序 API 密钥将继续有效

显示为应用程序添加新 API 密钥的图示 5。 单击 下载 以下载包含应用程序用户名和 API 密钥的 apiKey.json 此图显示了突出显示的应用程序新 API 密钥的 "下载" 按钮

附录 4:IBM MQ C 客户机

如果您没有 IBM MQ 客户机命令行工具和样本(runmqsc、amqsputc 和 amqsgetc),可以从此处进行下载。

  1. 如下所示选择最新的包,写入时的最新版本为 9.0.5 显示 IBM MQ 客户机版本的图像
  2. 通过选中软件包左侧的框,选择 " [您的操作系统]的IBM MQC 可再分发客户机" ,如下所示。 文件名中应该有 Redist。 本教程是使用 Linux Ubuntu 操作系统创建的 此图显示选择与操作系统兼容的可再分发 MQ C 客户机
  3. 选择通过 HTTPS 下载,这将允许您直接通过浏览器下载客户端,如下所示 此图显示选择了 HTTPS 的多个下载选项
    • :如果您没有此选项,请尝试使用替代浏览器。
  4. 单击“继续”后, 会将您重定向到以下所示的屏幕。 点击红色圆圈显示的符号开始下载 单击红色圆圈指示的图像
  5. 下载后,将文件解压缩到您选择的目录 <PATH_TO_MQCLIENT_DIR>
    • tar -xvzf <IBM-MQC-Redist>.tar.gz <PATH_TO_MQCLIENT_DIR>
  6. 向路径添加命令
    • export PATH=$PATH:<PATH_TO_MQCLIENT_DIR>/bin:<PATH_TO_MQCLIENT_DIR>/samp/bin