使用pymqi连接IBM MQ遇MQRC_KEY_REPOSITORY_ERROR错误求助
解决pymqi连接IBM MQ时的MQRC_KEY_REPOSITORY_ERROR错误
错误信息
Traceback (most recent call last): File "c:\myDirectory\testMQ.py", line 92, in <module> connect_to_mq() File "c:\myDirectory\testMQ.py", line 68, in connect_to_mq qmgr.connect_with_options(queue_manager, cd, sco) File "C:\python\lib\site-packages\pymqi\__init__.py", line 1747, in connect_with_options raise MQMIError(rv[1], rv[2]) pymqi.MQMIError: MQI Error. Comp: 2, Reason 2381: FAILED: MQRC_KEY_REPOSITORY_ERROR
环境信息
OS : Windows 10 Python : 3.10.7 pip : 23.2.1 pymqi : 1.12.10 IBM MQ : 9.2.0.21
问题描述
使用pymqi库通过SSL连接IBM MQSeries时触发MQRC_KEY_REPOSITORY_ERROR(2381)错误,已拥有SSL所需的信任库、密钥库文件及对应密码,但不清楚如何正确配置信任库相关参数。
解决方案
该错误核心原因是密钥库路径格式错误,且缺少密钥库/信任库的密码配置。针对JKS格式的密钥库,按以下步骤调整:
- 修正密钥库路径格式:IBM MQ客户端识别JKS文件时,需在路径前添加
*JKS前缀,格式为*JKS <文件完整路径>,明确告知客户端使用JKS类型的密钥库。 - 添加密码配置:通过
pymqi.SCO对象的SSLKeyPassword(密钥库密码)和SSLTrustPassword(信任库密码)属性配置对应密码,若两者为同一文件,可设置相同密码。 - 其他注意事项:确保JKS文件路径使用正斜杠
/或转义反斜杠\\;确认SSLCipherSpec与MQ服务器端配置一致;检查JKS文件权限,保证Python进程可读取。
修改后的代码
import pymqi queue_manager = "<QUEUE_NAME>" channel = b"<CHANNEL_NAME>" host = "<HOST>" port = "<PORT>" queue_name = "<FILE_QUEUE_NAME.QA>" user = b"<user>" password = b"<pwd>" # 替换为实际的密钥库/信任库密码 key_store_pwd = b"<KEY_STORE_PASSWORD>" trust_store_pwd = b"<TRUST_STORE_PASSWORD>" conn_info = '%s(%s)' % (host, port) ssl_cipher_spec = b"TLS_RSA_WITH_AES_256_CBC_SHA256" # 修正JKS路径格式 key_repo_location = b'*JKS C:/myDirectory/keystore.jks' message = '{"message":"Hello from Python !"}' # ------- GET MESSAGE ------- md = pymqi.MD() gmo = pymqi.GMO() gmo.Options = pymqi.CMQC.MQGMO_WAIT | pymqi.CMQC.MQGMO_FAIL_IF_QUIESCING gmo.WaitInterval = 5000 # 5秒 # ------- GET MESSAGE ------- # ------- SSL INFO ------- cd = pymqi.CD() cd.ChannelName = channel cd.ConnectionName = conn_info.encode('utf-8') cd.ChannelType = pymqi.CMQC.MQCHT_CLNTCONN cd.TransportType = pymqi.CMQC.MQXPT_TCP cd.SSLCipherSpec = ssl_cipher_spec cd.UserIdentifier = user cd.Password = password sco = pymqi.SCO() sco.KeyRepository = key_repo_location # 添加密钥库和信任库密码 sco.SSLKeyPassword = key_store_pwd sco.SSLTrustPassword = trust_store_pwd # ------- SSL INFO ------- qmgr = pymqi.QueueManager(None) qmgr.connect_with_options(queue_manager, cd, sco) queue = pymqi.Queue(qmgr, queue_name) # 发送消息 print(f"发送消息") queue.put(message) print(f"消息发送完成") queue.close() print(f"关闭队列") queue = pymqi.Queue(qmgr, queue_name) # 读取消息 print(f"读取消息") msg = queue.get(None, md, gmo) print(msg) queue.close() print(f"关闭队列") qmgr.disconnect() print(f"断开连接")
内容的提问来源于stack exchange,提问作者Myke
相关产品推荐
相关产品推荐

