IBM Cloud Docs
启用应用程序 Advanced Message Security (AMS)

启用应用程序 Advanced Message Security (AMS)

本指南将指导您在应用程序级别启用 "高级消息安全性"。

什么是 IBM MQ Advanced Message Security?

在异步消息传递系统中,一个进程连接到队列管理器以放入消息(称为“发送方”或“发布程序”),另一个独立的进程连接到队列管理器以使用该消息(称为“接收方”或“订户”)。 这两个进程松散耦合,并不直接知道彼此。 使用者应用程序可以访问的唯一身份信息是消息本身中的身份信息。 如果消息在传输过程中更改或消息是由未经授权的发送方生成的,那么使用者无法通过明文消息检测到此情况。 在这种情况下,使用应用程序会信任消息的身份,但无法验证其真实性。 此外,此过程很可能会造成消息在由队列管理器监管期间被拦截和修改。

IBM® MQ Advanced Message Security 扩展了 MQ 安全服务,可在“消息”级别提供安全性,以保护敏感数据,例如高价值的财务交易和个人信息。 MQ Advanced Message Security 基于拦截器,即,出站消息在移交给队列管理器之前会被拦截、进行签名和(可选)加密。 从队列管理器接收到的入站消息会放入 AMS 层,根据需要进行解密和验证,然后将其移交给接收应用程序。 AMS 体系结构能够对消息进行加密保护,并实施细颗粒度的 保护策略 ,这些策略授权单个消息发送方和消息接收方,但对应用程序逻辑的更改很少或没有任何更改。

实现 IBM MQ AMS 有两种方法,我们将其称为应用程序 AMS 和队列管理器 AMS。 本教程重点说明应用程序 AMS。

AMS 保护策略

保护策略定义用于保护消息的保护质量。 AMS 提供的消息保护策略允许对消息内容进行签名和加密。 AMS 策略由目标队列上的 MQ 管理员进行定义,并且每个队列可以没有策略或刚好有一个策略。 策略可以指定用于签名和加密操作的算法。 有两种类型的消息保护策略:

  • 消息完整性策略,其中会将数字签名应用于消息,但消息的内容仍保留为明文。
  • 消息隐私策略,其中消息的内容还会加密。 消息隐私策略还包含消息完整性。

指定加密时,此策略还必须指定所有授权接收方,并且发送方必须在本地密钥库中具有这些接收方的公用密钥。

端到端消息安全性

要对消息进行端到端保护,需要考虑以下方面:

  1. 传输中的消息受到保护。
  2. 保证消息源自预期的源。
  3. 消息只能由预期接收方查看。
  4. 保证消息在传输过程中未被改动。

将加密机制放入队列管理器本身可避免产生修改应用程序的费用,但这并不能完全解决问题。 由于队列管理器有能力对消息进行加密和解密,因此接收方无法保证收到的消息是真实的。 例如,对于 B2B,拓扑是轴辐式结构,其中清算中心充当轮轴,每根辐条表示不同的业务合作伙伴。 在此类场景中,为了保证消息不被篡改且真实,端到端保护是理想的解决方案。

应用程序 AMS 通过以加密方式将发送方的身份(由 X.509 证书中的专有名称表示)绑定到消息,提供端到端消息级别安全性。 如果需要,还可以针对特定接收方加密消息,这些接收方也同样通过 X.509 证书进行标识。 能够将发送方和接收方身份绑定到消息并防止消息被篡改,有助于创建关于谁可以发送或接收消息的策略,并且将逐个消息来强制实施这些策略。

本教程将自签名证书用于发送方和接收方。 对于生产用例,强烈建议使用 CA 证书。 自签名证书仅用于测试和演示目的。

准备工作

  1. 现有 MQ on Cloud 队列管理器或 创建队列管理器 (如果没有队列管理器)。
  2. 队列管理器的连接详细信息,请参阅 附录 1
  3. 管理用户名 nad apikey ,请参阅 附录 2
  4. IBM MQ Client ,本教程使用 runmqsc进行安装,请参阅 附录 3

设置消息的发送方和接收方

本教程将 alicebob 这两个用户用于 AMS 设置以及演示端到端消息安全性:alice 作为消息的发送方,而 bob 作为消息的接收方。 在现实世界中,消息的发送方和接收方在不同系统上运行,使用 AMS 在消息的这些发送方和接收方之间强制实施消息保护,可确保消息不被篡改且真实。

对于本教程,需要在 MQ on Cloud 服务上将这两个用户创建为用户凭证应用程序凭证。 本教程使用应用程序凭证,即,向应用程序授予许可权,允许它访问队列管理器以放入消息,并且它用于此许可权的用户名将为 alice。 同样,向该应用程授予许可权,允许它访问队列管理器以获取消息,并且用于此许可权的用户名将为 bob

  1. 登录到 IBM Cloud。
  2. 在 IBM Cloud 仪表板上,从服务列表中,找到所需 MQ on Cloud 队列管理器所在的服务实例。 通过单击服务实例来将其打开。 显示服务实例的图像
  3. 这将打开队列管理器视图。 选择 应用程序凭证 选项卡。 此图显示具有 "应用程序" 许可权的队列管理器的列表 (以圆圈表示)
  4. 现在,单击添加按钮,并为用户 alice 填写表单,如下图所示:
    1. 在表单的 显示名称: 字段中,输入值 alice
    2. 在表单的 应用程序用户名: 字段中,将自动填充 alice
    3. 单击 添加并生成 API 密钥
      此图显示当前设置的应用程序许可权
  5. 添加用户后,将生成新的 API 密钥,并且该密钥会显示在弹出窗口中。 单击 下载 以下载 applicationApiKey.json ,将文件另存为 "applicationApiKey<userName>.json (对于 ex:"applicationApiKeyalice.json) 到方便的位置。
    显示 applicationApiKey.json 下载的图像
  6. 现在,单击 添加 ,并填写用户 bob的如下图所示的表单:
    6.1 在表单的**显示名称:字段中,输入值 bob。 6.2 在表单的应用程序用户名:**字段中,将自动填充 bob。 6.2 单击 添加并生成 API 密钥
    此图显示当前设置的应用程序许可权
  7. 添加用户后,将生成新的 API 密钥,并且该密钥会显示在弹出窗口中。 单击 下载 以下载 applicationApiKey.json ,将文件另存为 "applicationApiKey<username>.json (对于 ex:"applicationApiKeybob.json) 到方便的位置。
    显示 "applicationApiKey.json download" 的图像

配置 AMS 之前发送和接收消息

作为 AMS 配置的第一步,可以检查 alicebob 是否能够发送和接收消息。 这将有助于确保客户机和队列管理器能够通信并交换消息。 在本教程的其他部分中,说明了 AMS 设置和配置。 此时,我们使用 alice 作为发送方,bob 作为接收方,在目标队列上发送和接收明文形式的消息。

  1. 打开两个命令 shell。 一个用于用户 alice,另一个用于用户 bob

    1. 我们将对 alice 使用一个命令 shell,并且在该 shell 上执行 alice 的所有步骤。 从现在开始,此命令 shell 将被称为 alice 的命令 shell。
    2. 我们将对 bob 使用另一个命令 shell,并且在该 shell 上执行 bob 的所有步骤。 从现在开始,此命令 shell 将被称为 bob 的命令 shell。
    3. 在本教程中,将需要 alicebob 命令 shell。 因此,在完成本教程中的所有步骤之前,请不要关闭这两个 shell。
  2. alice 的命令 shell 中创建以下环境变量。

    • 在 Linux/Mac 上:
      export MQSAMP_USER_ID=alice  
      export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
      
    • 在 Windows 上:
      set MQSAMP_USER_ID=alice  
      set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)
      
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname" (请参阅 Appendix#1)
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort" (请参阅 Appendix#1)
  3. bob 的命令 shell 中创建以下环境变量。

    • 在 Linux/Mac 上:
      export MQSAMP_USER_ID=bob  
      export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
      
    • 在 Windows 上:
      set MQSAMP_USER_ID=bob  
      set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)
      
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname" (请参阅 Appendix#1)
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort" (请参阅 Appendix#1)
  4. alice 的命令 shell 中,运行样本程序以将消息发送到目标队列。

    amqsputc DEV.QUEUE.1 <your Queue manager name>  
    
    1. 提示输入密码时,输入 alice 的应用程序 API 密钥 (这是文件 "applicationApiKeyalice.json"中的" apiKey " 值)
    2. 输入消息文本,然后按两次 Enter 键以仅发送一条消息。

    按两次 Enter 键将退出样本应用程序。

    显示 alice 发送纯文本消息的图像

  5. 现在,检查用户 bob 是否能够从目标队列中检索到消息。

    1. bob 命令 shell ,运行样本程序以接收消息。
      amqsgetc DEV.QUEUE.1 <your Queue manager name>  
      
    2. 提示输入密码时,输入 bob 的应用程序 API 密钥 (这是文件 "applicationApiKeybob.json"中的" apiKey " 值)。
    3. 您可以看到接收到的消息- message <Hello> 确认用户 bob 能够从目标队列读取消息。
      显示 bob 接收纯文本消息的图像
    • 请注意,读取队列时消息以明文形式返回,因为这就是消息在目标队列上的存储方式。

此测试确认 alicebob 可以在目标队列上发送和接收消息。 下一步是创建 AMS 需要的配置,以实现端到端安全性。 这包括为这些用户创建密钥库和证书,以强制对消息进行签名和加密。

alicebob 设置密钥库

应用程序 AMS 基于公用/专用密钥加密,其中密钥存储在标准 X.509 证书中,而这些证书存储在与平台相应的密钥库中。 这些证书是用于 MQ 安全套接字层 (SSL) 和传输层安全性 (TLS) 加密的相同类型证书,实际上,如果需要,应用程序可以将相同的证书和密钥库用于这两种加密。 本教程将为用户 alicebob 创建新的密钥库和证书。

所有 alice 的 步骤都必须在 alice 的 命令 shell 中执行,而所有 bob 的 步骤都必须在 bob 的 命令 shell 中执行。

  1. 创建用于设置密钥库的目录
    For alice:
        - On Mac: mkdir -p ~/alice/.mqs
        - On Linux:  mkdir -p /home/alice/.mqs
        - On Windows: mkdir %HOMEDRIVE%\Users\alice\.mqs
    
    For bob:
        - On Mac: mkdir -p ~/bob/.mqs
        - On Linux: mkdir -p /home/bob/.mqs  
        - On Windows: mkdir %HOMEDRIVE%\Users\bob\.mqs
    
  2. 创建密钥数据库
     For alice:
         - On Mac: runmqakm -keydb -create -db ~/alice/.mqs/alicekey.kdb -pw passw0rd -stash
         - On Linux: runmqakm -keydb -create -db /home/alice/.mqs/alicekey.kdb -pw passw0rd -stash  
         - On Windows: runmqakm -keydb -create -db %HOMEDRIVE%\Users\alice\.mqs\alicekey.kdb -pw passw0rd -stash
    
     For bob:
         - On Mac: runmqakm -keydb -create -db ~/bob/.mqs/bobkey.kdb -pw passw0rd -stash
         - On Linux: runmqakm -keydb -create -db /home/bob/.mqs/bobkey.kdb -pw passw0rd -stash
         - On Windows: runmqakm -keydb -create -db %HOMEDRIVE%\Users\bob\.mqs\bobkey.kdb -pw passw0rd -stash  
    
  3. 确保密钥数据库可读(仅限 Linux 和 Mac)
    Mac:
    For alice:
        chmod +r ~/alice/.mqs/alicekey.kdb
    For bob:   
        chmod +r ~/bob/.mqs/bobkey.kdb
    
    Linux:
    For alice:     
        chmod +r /home/alice/.mqs/alicekey.kdb  
    For bob:   
        chmod +r /home/bob/.mqs/bobkey.kdb  
    
  4. 为用户 alice 创建自签名证书
    On Mac:
        - runmqakm -cert -create -db ~/alice/.mqs/alicekey.kdb -pw passw0rd -label Alice_Cert -dn "cn=alice,O=IBM,c=GB" -default_cert yes
    
    On Linux:
        - runmqakm -cert -create -db /home/alice/.mqs/alicekey.kdb -pw passw0rd -label Alice_Cert -dn "cn=alice,O=IBM,c=GB" -default_cert yes  
    
    On Windows:
        - runmqakm -cert -create -db %HOMEDRIVE%\Users\alice\.mqs\alicekey.kdb -pw passw0rd -label Alice_Cert -dn "cn=alice,O=IBM,c=GB" -default_cert yes  
    
  5. 为用户 bob 创建自签名证书
    On Mac:
        - runmqakm -cert -create -db ~/bob/.mqs/bobkey.kdb -pw passw0rd -label Bob_Cert -dn "cn=bob,O=IBM,c=GB" -default_cert yes
    
    On Linux:
        - runmqakm -cert -create -db /home/bob/.mqs/bobkey.kdb -pw passw0rd -label Bob_Cert -dn "cn=bob,O=IBM,c=GB" -default_cert yes  
    
    On Windows:
        - runmqakm -cert -create -db %HOMEDRIVE%\Users\bob\.mqs\bobkey.kdb -pw passw0rd -label Bob_Cert -dn "cn=bob,O=IBM,c=GB" -default_cert yes
    

在目标队列上设置保护策略

MQ Advanced Message Security 使用安全策略来指定密码加密和签名算法,以加密和认证流经队列的消息。 我们需要在队列上设置 AMS 策略以启用消息安全性。

  1. 打开新的命令 shell

  2. 创建 MQSERVER 环境变量

    On Linux and Mac: export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"  
    On Windows: set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)  
    
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  3. 运行 runmqsc 以连接到远程队列管理器

    runmqsc -c -u <ADMIN_MQ_USER> <QUEUE_MANAGER_NAME>  
    
    • <ADMIN_MQ_USER> -这是 platformApiKey.json 文件中的 "mqUsername" (请参阅本教程底部的 附录 2 )
    • <QUEUE_MANAGER_NAME> -这是 connection_info.txt 文件中的 "queueManagerName"
    • “-c”使用 MQSERVER 变量通知 runmqsc 应该连接到远程队列管理器
  4. 终端将提示您输入密码。
    这是 platformApiKey.json 文件中的“apiKey”值(请参阅本教程底部的附录 2

  5. 现在,终端在等待进行输入。

  6. 在目标队列上创建新的 AMS 策略

    SET POLICY(DEV.QUEUE.1) SIGNALG(SHA1) ENCALG(AES256) SIGNER('CN=alice,O=IBM,C=GB') RECIP('CN=bob,O=IBM,C=GB') ACTION(ADD)
    
    • DEV.QUEUE.1 是策略名称,必须与要保护的队列的名称相匹配。
    • SIGNALG(value) 指定用于对消息签名的数字签名算法。
    • ENCALG(value) 指定用于对消息加密的数字加密算法。
    • SIGNER(value) 是本教程中发送方(即 alice)的 -dn 值。
    • RECIP(value) 是本教程中接收方(即 bob)的 -dn 值。
    • 有关 SET POLICY 命令的详细说明可以在此处找到。

    此图显示队列上设置的 AMS 保护策略

  7. 验证刚才定义的 AMS 策略:要确保已根据我们的设置,使用签名和加密正确定义和配置了策略,请使用以下命令。

    DISPLAY POLICY(DEV.QUEUE.1)
    

    显示来自 runmqsc 的 AMS 保护策略显示的图像

创建别名队列以验证消息加密

为了证明消息在队列中存储时已加密,我们将使用别名队列。 通过别名队列检索消息不会触发目标队列上的拦截器,因此将按原样检索消息而不进行解密,这将准确表明消息是明文还是已加密。

  1. 创建目标设定为某个队列的别名队列

    DEFINE QALIAS (DEV.QUEUE.1.ALIAS) TARGET (DEV.QUEUE.1)  
    
    • DEV.QUEUE.1.ALIAS 是别名队列的名称
    • DEV.QUEUE.1 是在本教程中使用的目标队列

    显示正在创建的别名队列的图像

alicebob 之间共享公用密钥

保护策略设置为使用加密时,还必须指定消息的所有授权接收方。 此外,该消息的发送方必须在其本地密钥库中具有这些接收方的公用密钥。 策略还可以指定授权发送方,并且此指定会强制用于已签名或已加密的消息,在这种情况下,接收方必须具有发送方的公用密钥才能验证消息的身份。 即,alice 必须在其密钥库中具有 bob 的公用密钥,并且 bob 在其密钥库中需要 alice 的公用密钥。

此部分提供了详细步骤,用于抽取 bob 的公用密钥并将其添加到 alice 的密钥库,以及抽取 alice 的公用密钥并将其添加到 bob 的密钥库。

  1. 抽取 bob 的公用密钥并将其添加到 alice 的密钥库

    On Mac:
        - runmqakm -cert -extract -db ~/bob/.mqs/bobkey.kdb -pw passw0rd -label Bob_Cert -target bob_public.arm  
        - runmqakm -cert -add -db ~/alice/.mqs/alicekey.kdb -pw passw0rd -label Bob_Cert -file bob_public.arm  
    
    On Linux:  
        - runmqakm -cert -extract -db /home/bob/.mqs/bobkey.kdb -pw passw0rd -label Bob_Cert -target bob_public.arm  
        - runmqakm -cert -add -db /home/alice/.mqs/alicekey.kdb -pw passw0rd -label Bob_Cert -file bob_public.arm  
    
    On Windows:  
        - runmqakm -cert -extract -db %HOMEDRIVE%\Users\bob\.mqs\bobkey.kdb -pw passw0rd -label Bob_Cert -target bob_public.arm  
        - runmqakm -cert -add -db %HOMEDRIVE%\Users\alice\.mqs\alicekey.kdb -pw passw0rd -label Bob_Cert -file bob_public.arm
    
  2. 抽取 alice 的公用密钥并将其添加到 bob 的密钥库

    On Mac:
        - runmqakm -cert -extract -db ~/alice/.mqs/alicekey.kdb -pw passw0rd -label Alice_Cert -target alice_public.arm  
        - runmqakm -cert -add -db ~/bob/.mqs/bobkey.kdb -pw passw0rd -label Alice_Cert -file alice_public.arm  
    
    On Linux:  
        - runmqakm -cert -extract -db /home/alice/.mqs/alicekey.kdb -pw passw0rd -label Alice_Cert -target alice_public.arm  
        - runmqakm -cert -add -db /home/bob/.mqs/bobkey.kdb -pw passw0rd -label Alice_Cert -file alice_public.arm  
    
    On Windows:  
        - runmqakm -cert -extract -db %HOMEDRIVE%\Users\alice\.mqs\alicekey.kdb -pw passw0rd -label Alice_Cert -target alice_public.arm  
        - runmqakm -cert -add -db %HOMEDRIVE%\Users\bob\.mqs\bobkey.kdb -pw passw0rd -label Alice_Cert -file alice_public.arm
    
  3. 验证 alice 在其密钥库中是否具有 bob 的证书(公共部分),以及 bob 在其密钥库中是否具有 alice 的证书(公共部分)。 这可以通过运行以下显示证书详细信息的命令来实现:

    For alice:
        - On Mac: runmqakm -cert -details -db ~/alice/.mqs/alicekey.kdb -pw passw0rd -label Bob_Cert
        - On Linux: runmqakm -cert -details -db /home/alice/.mqs/alicekey.kdb -pw passw0rd -label Bob_Cert  
        - On Windows: runmqakm -cert -details -db %HOMEDRIVE%\Users\alice\.mqs\alicekey.kdb -pw passw0rd -label Bob_Cert  
    
    For bob:
        - On Mac: runmqakm -cert -details -db ~/bob/.mqs/bobkey.kdb -pw passw0rd -label Alice_Cert
        - On Linux: runmqakm -cert -details -db /home/bob/.mqs/bobkey.kdb -pw passw0rd -label Alice_Cert  
        - On Windows: runmqakm -cert -details -db %HOMEDRIVE%\Users\bob\.mqs\bobkey.kdb -pw passw0rd -label Alice_Cert  
    

alicebob 创建 keystore.conf 文件

AMS 拦截器将需要用户(在本教程中为 alice 和 bob)的配置文件,其中包含有关密钥库所在位置以及要使用的证书标签的详细信息。 AMS 需要这些信息以用于对消息进行签名和加密,以及用于身份检查,从而实现端到端保护。 AMS 需要将配置文件命名为**“keystore.conf”**,并以明文形式包含详细信息。 每个用户都必须具有单独的 keystore.conf 文件。

此部分将指导您为 alicebob 创建 keystore.conf 文件。

  1. 在 .mqs 目录中为用户 alice 创建新的 keystore.conf 文件,然后将以下内容复制到该文件中。

    在 Mac 上:

    cms.keystore=~/alice/.mqs/alicekey  
    cms.certificate=Alice_Cert  
    

    在 Linux 上:

    cms.keystore=/home/alice/.mqs/alicekey  
    cms.certificate=Alice_Cert  
    

    在 Windows 上:

    cms.keystore=%HOMEDRIVE%\Users\alice\.mqs\alicekey  
    cms.certificate=Alice_Cert  
    
    • 将 %HOMEDRIVE% 替换为计算机上的相应值(例如:C:)
  2. 在用户 bob 的 .mqs 目录中创建新文件 keystore.conf ,并将以下内容复制到其中。
    在 Mac 上:

    cms.keystore=~/bob/.mqs/bobkey  
    cms.certificate=Bob_Cert
    

    在 Linux 上:

    cms.keystore=/home/bob/.mqs/bobkey  
    cms.certificate=Bob_Cert  
    

    在 Windows 上:

    cms.keystore=%HOMEDRIVE%\Users\bob\.mqs\bobkey  
    cms.certificate=Bob_Cert  
    
    • 将 %HOMEDRIVE% 替换为计算机上的相应值(例如:C:)

测试端到端消息保护

MQ Advanced Message Security 提供:

  • 消息完整性:支持逐个消息对入站流量进行认证,并严格限制可以将这些消息发送到哪些队列以及哪些接收方可以接收这些消息。
  • 消息隐私:根据在目标队列上设置的保护策略,AMS 甚至会在将消息放入队列之前就对消息加密,由此确保其内容绝不会公开。

证明端到端消息安全性涉及证明消息完整性和消息隐私。 首先证明消息完整性,在此可以看到不允许未经授权的用户访问受保护的队列。 然后,将检查授权用户(例如,alicebob)是否可以在受保护队列上发送和接收消息。 最后,我们将证明受保护队列中的静态消息经过加密且不可读取。

消息完整性检查

为了证明消息完整性受到保护,在不符合签名或加密策略的情况下访问受保护队列的任何尝试都将失败。 为了对此进行测试,我们将运行发送方程序,而不设置环境变量 MQS_KEYSTORE_CONF。 采用这种方式,AMS 会找不到要用于签名的密钥库和证书。
您可以观察到 alice 能够建立与队列管理器的连接,但尝试打开受保护队列会失败,因为 AMS 拦截器将在此时检查用户 alice 的身份。

  1. alice 的命令 shell 中创建以下环境变量。

    On Mac:
        export MQSAMP_USER_ID=alice  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
    
    On Linux:
        export MQSAMP_USER_ID=alice  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
    
    On Windows:
        set MQSAMP_USER_ID=alice  
        set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)
    
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  2. 运行样本程序以接收消息。

    amqsputc DEV.QUEUE.1 <your Queue manager name>  
    
    • 在系统提示输入密码时,输入 alice 的应用程序 API 密钥(这是 "applicationApiKeyalice.json 文件中的“"applicationApiKey”值

    下图显示了 alice 打开受保护队列的尝试失败,带有 MQRC_NOT_AUTHORIZED。 显示将故障放入受保护队列的图像

消息安全性检查 - 授权用户可在受保护队列上发送和接收消息。

alicebob 已具有所需的配置,并且完全符合在目标队列上定义的保护策略。 这会使 alicebob 成为受保护队列上消息的授权发送方和接收方。 在此证明过程中,我们将使用 alice 的用户标识运行发送方程序 (amqsputc),以将消息发送到受保护队列。 然后,使用 bob 的用户标识运行接收方程序 (amqsgetc),以接收消息。

  1. 在 alice 的命令 shell 中创建以下环境变量。
    On Mac:
        export MQSAMP_USER_ID=alice  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF="~/alice/.mqs/keystore.conf"
    
    On Linux:
        export MQSAMP_USER_ID=alice  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF="/home/alice/.mqs/keystore.conf"
    
    On Windows:
        set MQSAMP_USER_ID=alice  
        set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)
        set MQS_KEYSTORE_CONF=C:\Users\alice\.mqs\keystore.conf
    
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  2. 在 bob 的命令 shell 中创建以下环境变量。
    On Mac:
        export MQSAMP_USER_ID=bob  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF="~/bob/.mqs/keystore.conf"
    
    On Linux:
        export MQSAMP_USER_ID=bob  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF="/home/bob/.mqs/keystore.conf"
    
    On Windows:
        set MQSAMP_USER_ID=bob  
        set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)
        set MQS_KEYSTORE_CONF=C:\Users\bob\.mqs\keystore.conf
    
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  3. alice 的命令 shell 中,运行样本程序以将消息发送到受保护队列。
    amqsputc DEV.QUEUE.1 <your Queue manager name>  
    
    3.1 提示输入密码时,输入 alice 的应用程序 API 密钥 (这是 "applicationApiKeyalice.json"文件中的" apiKey " vaule)。
    3.2 输入消息文本,然后按 Enter 键两次以仅发送一条消息。
    : 两次按下 Enter 键将退出样本应用程序。
    显示将消息发送到受保护队列的 alice 的图像
  4. bob 的命令 shell 中,运行样本程序以接收消息。
    amqsgetc DEV.QUEUE.1 <your Queue manager name>  
    
    4.1 提示输入密码时,输入 bob 的应用程序 API 密钥 (这是 "applicationApiKeybob.json"文件中的" apiKey " 值)
    4.2 您可以看到接收到的消息 message <Hello> 确认 bob 能够读取消息数据。
    显示 bob 从受保护的 ueue 接收消息的图像

消息隐私检查 - 数据存储为加密数据。

为了证明消息已加密,我们将使用别名队列进行测试。 通过别名队列检索消息不会触发目标队列上的拦截器,因此将按原样检索消息而不进行解密,这将准确表明消息是明文还是已加密。 在此证明过程中,我们将使用 alice 的用户标识运行发送方程序 (amqsputc),以将消息发送到受保护队列。 然后,使用 bob 的用户标识运行接收方程序 (amqsgetc),以从别名队列接收消息。

  1. 在 alice 的命令 shell 中创建以下环境变量。
    On Mac:
        export MQSAMP_USER_ID=alice  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF="~/alice/.mqs/keystore.conf"
    
    On Linux:
        export MQSAMP_USER_ID=alice  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF="/home/alice/.mqs/keystore.conf"
    
    On Windows:
        set MQSAMP_USER_ID=alice  
        set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)
        set MQS_KEYSTORE_CONF=C:\Users\alice\.mqs\keystore.conf
    
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  2. 在 bob 的命令 shell 中创建以下环境变量。
    On Mac:
        export MQSAMP_USER_ID=bob  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF=~/bob/.mqs/keystore.conf
    
    On Linux:
        export MQSAMP_USER_ID=bob  
        export MQSERVER="CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)"
        export MQS_KEYSTORE_CONF=/home/bob/.mqs/keystore.conf
    
    On Windows:
        set MQSAMP_USER_ID=bob  
        set MQSERVER=CLOUD.ADMIN.SVRCONN/TCP/<HOSTNAME>(<PORT>)
        set MQS_KEYSTORE_CONF=C:\Users\bob\.mqs\keystore.conf
    
    • <HOSTNAME> -这是 connection_info.txt 文件中的 "hostname"
    • <PORT> -这是 connection_info.txt 文件中的 "listenerPort"
  3. alice 的命令 shell 中,运行样本程序以将消息发送到受保护队列。
    amqsputc DEV.QUEUE.1 <your Queue manager name>  
    
    3.1 提示输入密码时,输入 alice 的应用程序 API 密钥 (这是文件 "applicationApiKeyalice.json"中的" apiKey " 值)。
    3.2 输入消息文本,然后按 Enter 键两次以仅发送一条消息。
    : 两次按下 Enter 键将退出样本应用程序。
    显示将消息发送到 protectec 队列的 alice 的图像
  4. 在 bob 的命令 shell 中,运行样本程序以接收消息。
    amqsgetc DEV.QUEUE.1.ALIAS <your Queue manager name>  
    
    4.1 在提示输入密码时输入 bob 的应用程序 API 密钥 (这是文件 "applicationApiKeybob.json"中的" apiKey " 值)
    4.2 您可以看到接收到消息,因为 message <PDMQ> 显示数据已加密,因此确认消息已存储为已加密且非授权用户不可读。 显示从别名队列接收消息的 bob 的图像

结论

您现在已经完成了本教程。 在本指南中,您已设置应用程序 AMS 以实现消息的端到端安全性。 我们已证明这可确保消息完整性和消息隐私受到保护,并且消息仅可供授权用户读取。

附录

附录 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 密钥按钮。

  5. 单击 下载 以下载包含 admin 用户名和 apikey 的 platformApiKey.json
    此图显示突出显示了管理新 API 密钥的 "下载" 按钮

附录 3:IBM MQ C 客户机

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

  1. 选择最新的软件包,如下所示,编写本文时的最新版本为 9.1.0
    显示 IBM MQ 客户机版本的图像

  2. 通过勾选软件包左侧的框来选择 IBM MQC redistributable client for <Your Operating System> ,如下所示。 文件名中应该有 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