在运行.net Core IBM MQ的Linux Docker容器中获取MQRC_HOST_NOT_AVAILABLE错误。任何解决方案

在运行.net Core IBM MQ的Linux Docker容器中获取MQRC_HOST_NOT_AVAILABLE错误。任何解决方案,docker,.net-core,containers,mq,Docker,.net Core,Containers,Mq,我有一个.Net核心应用程序,它将消息放在IBM消息队列中。该连接是安全的ssl连接,使用cypherspec TLS_RSA_和_AES_256_CBC_SHA256。我正在使用IBM.Net核心客户端的示例应用程序来管理代码。在我的计算机和Visual Studio上正常运行代码时,它可以在windows上运行 将证书保存在Dockerfile中 COPY ["myCAcert.crt", "/usr/local/share/ca-certificates/&q

我有一个.Net核心应用程序,它将消息放在IBM消息队列中。该连接是安全的ssl连接,使用cypherspec TLS_RSA_和_AES_256_CBC_SHA256。我正在使用IBM.Net核心客户端的示例应用程序来管理代码。在我的计算机和Visual Studio上正常运行代码时,它可以在windows上运行

将证书保存在Dockerfile中

COPY ["myCAcert.crt", "/usr/local/share/ca-certificates/" ]
RUN  update-ca-certificates;
但是,当从Linux Docker容器运行时,代码失败,我在dockerfile中使用了dotnet/core/aspnet:3.1-buster-slim。我做了telnet来检查主机是否具有可访问性和可访问性。我不知道为什么在容器上会出现这个错误

    private String hostName = "151.156.191.22";
    private int port = 1414;
    private String channelName = "CHANNELA";
    private String queueManagerName = "MYQUEUE";
    private String queueName = "MYQUEUENAME";
    private String userName = "s1user";
    private String password = "123tfdfa";
    private const String messageString = "test message";
    private int numberOfMsgs = 1;
    private String sslKeyRepository = "*USER";
    private String cipherSpec = "TLS_RSA_WITH_AES_256_CBC_SHA256";
    private String sslPeerName = null;
    private int keyResetCount = 0;
    private Boolean sslCertRevocationCheck = false;
    private MQQueueManager queueManager;
    private MQQueue queue;
    private Hashtable properties;
    private MQMessage message;

void PutMessages()
    {
        try
        {
            // mq properties
            properties = new Hashtable();
            properties.Add(MQC.TRANSPORT_PROPERTY, MQC.TRANSPORT_MQSERIES_MANAGED);
            properties.Add(MQC.HOST_NAME_PROPERTY, hostName);
            properties.Add(MQC.PORT_PROPERTY, port);
            properties.Add(MQC.CHANNEL_PROPERTY, channelName);
            properties.Add(MQC.USER_ID_PROPERTY, userName);
            properties.Add(MQC.PASSWORD_PROPERTY, password);

            if (sslKeyRepository != null)
            {
                properties.Add(MQC.SSL_CERT_STORE_PROPERTY, sslKeyRepository);
            }
            if (cipherSpec != null)
            {
                properties.Add(MQC.SSL_CIPHER_SPEC_PROPERTY, cipherSpec);
            }
            if (sslPeerName != null)
            {
                properties.Add(MQC.SSL_PEER_NAME_PROPERTY, sslPeerName);
            }
            if (keyResetCount != 0)
            {
                properties.Add(MQC.SSL_RESET_COUNT_PROPERTY, keyResetCount);
            }
            if (sslCertRevocationCheck != false)
            {
                MQEnvironment.SSLCertRevocationCheck = sslCertRevocationCheck;
            }
            
            queueManager = new MQQueueManager(queueManagerName, properties);

正在连接到队列管理器

MQException caught: 2538 - MQRC_HOST_NOT_AVAILABLE
   at IBM.WMQ.MQQueueManager.Connect(String queueManagerName)
   at IBM.WMQ.MQQueueManager..ctor(String queueManagerName, Hashtable properties)

Error Code: CWSMQ0006

我找到了自己问题的答案。有几件事导致了这个错误

  • net核心有自己的证书存储,应该在那里添加证书。 然后在Linux中也使用以下工作
  • 这将在证书存储中安装证书。接下来,像往常一样设置XMSC属性。以下内容将起作用

    cf.SetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY, "*USER");
    
    这个博客也有关于证书的解决方案 也在这里

    然后我收到2059错误QManager不可用。这是因为我用的是cypherspec

    我不得不将密码规范改为AES_128。同样在MQ服务器通道上接受AES128,因为正式的IBM.net库在linux中不支持AES256。关于另一个堆栈溢出的更多信息


    做这些改变,帮我解决了。如果您遇到类似问题,请告诉我。

    您在linux密钥库上安装了证书吗?您好,是的,我通过docker文件添加了。您是否从docker容器中的主机“151.156.191.22”进行了ping?@sashi我也这样做了,我对主机和端口1818进行了telnet。我获取连接的Resose回访队列管理器的AMQERR01.LOG文件,查看在接收2538时是否生成任何消息。
    cf.SetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY, "*USER");
    
     private String cipherSpec = "TLS_RSA_WITH_AES_256_CBC_SHA256";