繁体   English   中英

IBM-MQ:在客户端和队列管理器之间配置相互 TLS 认证

[英]IBM-MQ: Configuring mutual TLS authentication between client and queue manager

我正在尝试在客户端和 IBM-MQ 队列管理器之间设置 TLS 相互身份验证(使用ibmcom/mq Docker 映像)。 证书是根据本文自签名和创建的。 文档中所述,应该可以将服务器的私钥和两个证书烘焙到图像中。 我的Dockerfile看起来像这样:

FROM ibmcom/mq

USER mqm
COPY --chown=mqm:mqm 20-config.mqsc /etc/mqm/ # creation of additional queues, no problems here
COPY --chown=mqm:mqm keys_mq1/key.key /etc/mqm/pki/keys/mykey/
COPY --chown=mqm:mqm keys_mq1/key.crt /etc/mqm/pki/keys/mykey/
COPY --chown=mqm:mqm keys_client/client.crt /etc/mqm/pki/trust/0/

这些文件可以在正在运行的容器中找到:

/etc/mqm/pki/keys/mykey
drwxr-xr-x 1 mqm mqm 4096 Feb 16 11:18 .
drwxr-xr-x 1 mqm mqm 4096 Feb 16 11:18 ..
-rwxr-xr-x 1 mqm mqm 1253 Feb 16 10:54 key.crt
-rwxr-xr-x 1 mqm mqm 1704 Feb 16 10:53 key.key

/etc/mqm/pki/trust/0
drwxr-xr-x 2 mqm mqm 4096 Feb 16 13:34 .
drwxr-xr-x 3 mqm mqm 4096 Feb 16 13:34 ..
-rwxr-xr-x 1 mqm mqm 1054 Feb 16 13:29 client.crt

需要注意的一件事是,根据docs ,频道详细信息现在应该显示以下条目: CERTLABL(mykey) 就我而言,它只是CERTLABL( ) 但是,我不确定这是否是这里的问题,没有客户端身份验证的服务器身份验证似乎正在工作(见下文)。

DISPLAY CHANNEL(DEV.APP.SVRCONN)
     1 : DISPLAY CHANNEL(DEV.APP.SVRCONN)
AMQ8414I: Display Channel details.
   CHANNEL(DEV.APP.SVRCONN)                CHLTYPE(SVRCONN)
   ALTDATE(2020-02-16)                     ALTTIME(13.34.47)
   CERTLABL( )                             COMPHDR(NONE)
   COMPMSG(NONE)                           DESCR( )
   DISCINT(0)                              HBINT(300)
   KAINT(AUTO)                             MAXINST(999999999)
   MAXINSTC(999999999)                     MAXMSGL(4194304)
   MCAUSER(app)                            MONCHL(QMGR)
   RCVDATA( )                              RCVEXIT( )
   SCYDATA( )                              SCYEXIT( )
   SENDDATA( )                             SENDEXIT( )
   SHARECNV(10)                            SSLCAUTH(OPTIONAL)
   SSLCIPH(ANY_TLS12)                      SSLPEER( )
   TRPTYPE(TCP)

在客户端,我创建了两个 Java 密钥库(JKS),一个带有服务器的证书(信任库),一个带有客户端的密钥对。

我的连接尝试如下:

  1. 使用提供的app用户(无密码)和DEV.APP.SVRCONN通道连接到默认队列管理器QM1 客户端应用程序是与现有 MQ 基础架构完美配合的现有工具,我只是交换了密钥库和连接详细信息。

客户端异常: com.ibm.mq.MQException: JMSCMQ0001: WebSphere MQ call failed with compcode '2' ('MQCC_FAILED') reason '2035' ('MQRC_NOT_AUTHORIZED').

MQ 日志:

AMQ5534E: User ID 'app' authentication failed
AMQ5542I: The failed authentication check was caused by the queue manager CONNAUTH CHCKCLNT(REQDADM) configuration.
  1. 通过 IBM MQ Explorer 使用提供的admin用户和DEV.ADMIN.SVRCONN通道进行连接(在这种情况下,我切换到admin ,因为无论身份验证方法如何, app都没有足够的权限与 MQ Explorer 一起使用)。 我检查了“无密码”选项,因为我想使用客户端的证书进行身份验证。

MQ 资源管理器错误消息:

Access not permitted. You are not authorized to perform this operation. (AMQ4036)
  Explanation: The queue manager security mechanism has indicated that the userid associated with this request is not authorized to access the object.

MQ 日志:

AMQ5540E: Application 'MQ Explorer 8.0.0' did not supply a user ID and password
AMQ5541I: The failed authentication check was caused by the queue manager CONNAUTH CHCKCLNT(REQDADM) configuration.
AMQ9557E: Queue Manager User ID initialization failed for 'admin'.
  1. 与 2. 相同,但省略了客户端的密钥库并提供密码。 作品 这里的想法是验证至少服务器的证书配置正确(另一方面,我不确定 MQ Explorer 是否首先针对信任库强制检查服务器的证书)。

我错过了什么?

编辑:我的实际目标是对app用户和DEV.APP.SVRCONN通道使用相互身份验证。

CHANNEL 属性 CERTLABL

不需要设置此属性,除非您需要在此SVRCONN上提供与队列管理器上的所有其他通道不同的证书。 如果您没有此要求,请将CHANNEL属性CERTLABL留空并仅使用整个队列管理器范围的证书。 这或者遵循名为ibmWebSphereMQ<qm-name>的证书的默认模式,或者使用您使用以下 MQSC 命令设置的证书标签:

ALTER QMGR CERTLABL(my-certificate-label)

连接认证(MQ 内置密码检查)

在 V8 或更高版本创建的全新队列管理器将启用连接身份验证功能,这意味着队列管理器将检查您提供的任何密码,更重要的是,在您的场景中,将要求任何特权用户 id 必须提供一个。 您在连接尝试 1 中报告的错误消息:

AMQ5542I: The failed authentication check was caused by the queue manager CONNAUTH CHCKCLNT(REQDADM) configuration.

和连接尝试 2/3:

AMQ5540E: Application 'MQ Explorer 8.0.0' did not supply a user ID and password
AMQ5541I: The failed authentication check was caused by the queue manager CONNAUTH CHCKCLNT(REQDADM) configuration.

...告诉您连接身份验证要求您的用户 id,它认为是特权的(即 mqm 组的成员或类似的成员)没有提供密码。

如果您不需要对任何远程连接的特权用户 ID 进行密码检查,那么您可以在队列管理器上使用以下命令将其关闭。

ALTER AUTHINFO(SYSTEM.DEFAULT.AUTHINFO.IDPWOS) AUTHTYPE(IDPWOS) CHCKCLNT(OPTIONAL)

REFRESH SECURITY TYPE(CONNAUTH)

相互认证的 SSL/TLS

为了确保相互验证的 SSL/TLS,您最终需要确保您的CHANNEL属性SSLCAUTH设置为REQUIRED 但实现这一点的最简单方法是从将其设置为OPTIONAL开始,然后到达客户端正在验证队列管理器证书的位置,然后让它发送自己的证书,最后设置SSLCAUTH(REQUIRED)以确保它只有当客户继续这样做时才会起作用。

您需要确保在通道的两端都设置SSLCIPH 您在问题中没有提到这一点,但是您参考的说明使用SSLCIPH(ANY_TLS12)所以我假设您也这样做了。

如果您成功建立连接并且不确定客户端是否已将证书发送到队列管理器,请使用以下 MQSC 命令:-

DISPLAY CHSTATUS(DEV.ADMIN.SVRCONN) SSLPEER SSLCERTI

查看客户端发送的证书的 Subject 的 DN 和 Issuer 的 DN。 如果为空白,则不发送证书。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM