求助解决IBM MQ SSL初始化错误(MQRC_SSL_INITIALIZATION_ERROR)
问题描述
使用pymqi连接本地IBM MQ队列时触发SSL初始化错误:
pymqi.MQMIError: MQI Error. Comp: 2, Reason 2393: FAILED: MQRC_SSL_INITIALIZATION_ERROR
查看AMQERR01.LOG日志显示:
AMQ9660E: SSL key repository: password stash file absent or unusable.
已确认对应的.sth文件存在于指定目录,相关代码如下:
queue_manager = 'QM1' channel = b'DEV.APP.SVRCONN' host = '127.0.0.1' port = '1414' queue_name = 'DEV.QUEUE.1' conn_info = f'{host}({port})' conn_info = conn_info.encode('utf-8') ssl_cipher_spec = 'TLS_RSA_WITH_AES_256_CBC_SHA256'.encode('utf-8') key_repo_location = b'/var/mqm/qmgrs/QM1/ssl/key_1' key_repo_location_env = '/var/mqm/qmgrs/QM1/ssl/key_1' certificate_label = b'cert_1' user = 'app' password = 'qwerty' message = 'Hello from Python!' os.environ['MQSSLKEYR'] = key_repo_location_env cd = pymqi.CD() cd.ChannelName = channel cd.ConnectionName = conn_info cd.ChannelType = pymqi.CMQC.MQCHT_CLNTCONN cd.TransportType = pymqi.CMQC.MQXPT_TCP cd.SSLCipherSpec = ssl_cipher_spec cd.CertificateLabel = certificate_label sco = pymqi.SCO() sco.KeyRepository = key_repo_location sco.CertificateLabel = certificate_label qmgr = pymqi.QueueManager(None) qmgr.connect_with_options(queue_manager, cd, sco) put_queue = pymqi.Queue(qmgr, queue_name) put_queue.put(message)
排查与解决步骤
- 检查密钥库文件完整性:IBM MQ要求密钥库必须同时存在
.kdb(密钥数据库)和.sth(密码 stash 文件),且两者文件名完全一致(Linux系统区分大小写)。确认/var/mqm/qmgrs/QM1/ssl/目录下同时存在key_1.kdb和key_1.sth。 - 验证文件权限:运行Python程序的用户需对密钥库目录及文件拥有读权限。执行以下命令检查并调整权限:
若程序运行用户不属于ls -l /var/mqm/qmgrs/QM1/ssl/key_1.* chmod 644 /var/mqm/qmgrs/QM1/ssl/key_1.kdb /var/mqm/qmgrs/QM1/ssl/key_1.sth chmod 755 /var/mqm/qmgrs/QM1/ssl/mqm组,需将其加入该组或调整文件所属组权限。 - 统一密钥库路径配置:代码中同时设置了
MQSSLKEYR环境变量和sco.KeyRepository,两者路径需完全一致(均不包含文件后缀)。可暂时注释os.environ['MQSSLKEYR'],仅保留sco.KeyRepository配置,避免冲突。 - 重新生成stash文件:若
.sth文件存在但不可用,以mqm用户身份重新生成:su - mqm runmqckm -keydb -stashpw -db /var/mqm/qmgrs/QM1/ssl/key_1.kdb -pw <密钥库密码> - 核对通道SSL配置:确认队列管理器的
DEV.APP.SVRCONN通道SSLCIPH属性与代码中的TLS_RSA_WITH_AES_256_CBC_SHA256完全匹配,同时根据认证需求设置SSLCAUTH属性(单向认证设为OPTIONAL,双向认证设为REQUIRED)。 - 验证证书标签:确认代码中
CertificateLabel的值与密钥库中证书的标签完全一致(区分大小写)。
内容的提问来源于stack exchange,提问作者K Ashish
相关产品推荐
相关产品推荐

