Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker IBM-MQ:在客户端和队列管理器之间配置相互TLS身份验证_Docker_Ssl_Ibm Mq - Fatal编程技术网

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

Docker IBM-MQ:在客户端和队列管理器之间配置相互TLS身份验证,docker,ssl,ibm-mq,Docker,Ssl,Ibm Mq,我正在尝试在客户机和IBM-MQ队列管理器之间设置TLS相互身份验证(使用)。这些证书是自签名的,并根据该证书创建。如中所述,应该可以将服务器的私钥和两个证书烘焙到映像中。我的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

我正在尝试在客户机和IBM-MQ队列管理器之间设置TLS相互身份验证(使用)。这些证书是自签名的,并根据该证书创建。如中所述,应该可以将服务器的私钥和两个证书烘焙到映像中。我的
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
需要注意的是,根据,频道详细信息现在应该显示以下条目:
CERTLABL(mykey)
。在我的例子中,它只是
certabl()
。但是,我不确定这是否是问题所在,在没有客户端身份验证的情况下对服务器进行身份验证似乎是可行的(见下文)

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

我的连接尝试如下所示:

  • 使用提供的
    app
    用户(无密码)和
    DEV.app.SVRCONN
    频道连接到默认队列管理器
    QM1
    。客户机应用程序是一个与现有MQ基础设施完美配合的现有工具,我只是交换了密钥库和连接细节
  • 客户端异常:
    com.ibm.mq.MQException:JMSCMQ0001:WebSphere mq调用失败,代码为“2”(“MQCC_失败”)原因为“2035”(“MQRC_未授权”)。

    MQ日志:

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

    AMQ5534E: User ID 'app' authentication failed
    AMQ5542I: The failed authentication check was caused by the queue manager CONNAUTH CHCKCLNT(REQDADM) configuration.
    
    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'.
    
  • 与2相同,但省略了客户端的密钥库,而是提供了密码有效。这里的想法是验证至少服务器的证书配置正确(另一方面,我不确定mqexplorer是否首先针对信任库强制检查服务器的证书)
  • 我错过了什么

    编辑:我的实际目标是对
    app
    用户和
    DEV.app.SVRCONN
    channel.

    channel属性certabl使用相互身份验证 不需要设置此属性,除非您需要在此
    SVRCONN
    上提供与队列管理器上所有其他通道不同的证书。如果您没有此要求,请将
    CHANNEL
    属性
    certabl
    保留为空,并仅使用整个队列管理器范围的证书。这要么遵循名为
    ibmWebSphereMQ
    的证书的默认模式,要么使用您使用以下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,您最终需要确保您的
    通道
    属性
    SSLCAUTH
    设置为
    REQUIRED
    。但实现这一点最简单的方法是首先将其设置为
    可选
    ,然后到达客户端正在验证队列管理器证书的点,然后让它发送自己的证书,最后设置
    SSLCAUTH(必需)
    ,以确保只有当客户端继续这样做时,它才会工作

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

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

    DISPLAY CHSTATUS(DEV.ADMIN.SVRCONN) SSLPEER SSLCERTI
    

    查看客户端发送的证书的主体DN和颁发者DN。如果为空,则不会发送证书。

    Java只会在服务器信任它的情况下返回一个用于相互身份验证的证书。它与
    SSLCAUTH(可选)
    一起工作的事实表明队列管理器不信任客户端证书。请确保客户端的公钥位于队列管理器kdb文件中。
    CHCKCLNT(REQDADM)
    表示您必须为管理员用户指定密码,如果您为任何用户指定密码,则密码必须有效。#1失败,原因可能是您提供了密码,或者MQ认为
    应用程序
    是管理员#2失败,因为
    admin
    是管理员用户#3
    SSLCAUTH(可选)
    表示客户无需出示证书。如果
    DEV.ADMIN.SVRCONN
    设置了
    SSLCIPH
    ,则客户必须信任QM证书。