首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IBM-MQ:在客户端和队列管理器之间配置相互的TLS身份验证

IBM-MQ:在客户端和队列管理器之间配置相互的TLS身份验证
EN

Stack Overflow用户
提问于 2020-02-16 18:49:16
回答 1查看 1.8K关注 0票数 0

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

代码语言:javascript
运行
复制
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/

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

代码语言:javascript
运行
复制
/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

需要注意的一点是,根据文档,通道细节现在应该显示如下条目:CERTLABL(mykey)。在我的例子中,它只是CERTLABL( )。但是,我不确定这是否是问题所在,没有客户端身份验证的服务器身份验证似乎是有效的(参见下面)。

代码语言:javascript
运行
复制
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. 使用提供的QM1用户(没有密码)和DEV.APP.SVRCONN通道连接到默认队列管理器DEV.APP.SVRCONN。客户端应用程序是一个与现有MQ基础设施完美工作的现有工具,我只是交换了密钥存储和连接细节。

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

MQ日志:

代码语言:javascript
运行
复制
AMQ5534E: User ID 'app' authentication failed
AMQ5542I: The failed authentication check was caused by the queue manager CONNAUTH CHCKCLNT(REQDADM) configuration.
  1. 通过IBM使用提供的admin用户和DEV.ADMIN.SVRCONN通道进行连接(在此场景中,我切换到admin,因为app没有足够的权限用于method,而不管使用何种身份验证方法)。我检查了“无密码”选项,因为我想使用客户端的证书进行身份验证。

MQ资源管理器错误消息:

代码语言:javascript
运行
复制
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日志:

代码语言:javascript
运行
复制
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.相同,但省略客户端的密钥存储并提供密码。工作。这里的想法是验证服务器的证书配置是否正确(另一方面,我不确定truststore首先是否针对信任存储强制执行了对服务器证书的检查)。

我遗漏了什么?

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-17 03:36:07

通道属性CERTLABL

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

代码语言:javascript
运行
复制
ALTER QMGR CERTLABL(my-certificate-label)

连接身份验证(MQ内置密码检查)

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

代码语言:javascript
运行
复制
AMQ5542I: The failed authentication check was caused by the queue manager CONNAUTH CHCKCLNT(REQDADM) configuration.

和连接尝试2/3:

代码语言:javascript
运行
复制
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 (它认为是特权用户id(即mqm组成员或类似成员)没有提供密码)。

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

代码语言:javascript
运行
复制
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命令:

代码语言:javascript
运行
复制
DISPLAY CHSTATUS(DEV.ADMIN.SVRCONN) SSLPEER SSLCERTI

要查看客户端发送的证书的主题DN和颁发者DN,请执行以下操作。如果为空,则未发送证书。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60251992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档