我必须创建一个客户端来侦听队列中的消息。正在使用SSL,我正在使用dot net开发。我已经浏览了数百页的文档和论坛,以找到清晰简洁的内容,看起来就像是不是那样!
我有一个jks,我能够telnet到正在发布队列的服务器。以下是我到目前为止的代码......
var factoryfactory = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ);
var connectionfactory = factoryfactory.CreateConnectionFactory();
connectionfactory.SetIntProperty(XMSC.WMQ_CONNECTION_MODE,XMSC.WMQ_CM_CLIENT_UNMANAGED);
connectionfactory.SetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY, @"C:\...\spindev1.key");
connectionfactory.SetStringProperty(XMSC.WMQ_SSL_CIPHER_SPEC, "SHA_WITH_RSA");
connectionfactory.SetStringProperty(XMSC.WMQ_CHANNEL, "SPINDEV1");
var connection = connectionfactory.CreateConnection();
我认为某处必须有密码,但我无法弄清楚如何。我目前的错误是2538。
修改
所以我刚刚添加了IP和端口,现在我收到错误代码2393。
connectionfactory.SetStringProperty(XMSC.WMQ_HOST_NAME, "**.***.***.***");
connectionfactory.SetIntProperty(XMSC.WMQ_PORT, 1431);
编辑2
好的,现在我已经设法开始使用提供队列数据的人提供的代码,但他说,为了使用SSL密钥,应用程序必须作为spindev1运行 - 这肯定意味着创建一个全新的帐户?
答案 0 :(得分:2)
对于XMS .NET,密钥库必须是CMS类型,而不是JKS。 JKS适用于Java客户端。 CMS密钥库将以“.kdb”作为文件扩展名。因此,为XMSC.WMQ_SSL_KEY_REPOSITORY
指定CMS密钥库文件名(不带.kdb扩展名)。
在您正在使用的CipherSpec上,我在MQ中找不到SHA_WITH_RSA
。您可以验证名称是否正确,或者您可以尝试使用其他密码。
HTH
答案 1 :(得分:2)
好的问题现在已经解决了。下面是创建和启动连接的代码摘录。其中一个主要问题是SSL密钥是为一个名为dev1的用户创建的,而我的用户是mcanty。如果我知道更多,我相信这个结果会更快到来。
public SISMQConnection(string connectionFactoryName, string queueName, string sslPeerName,
string bindingsFilePath, string sslKeyRepository)
{
try
{
Hashtable aHashtable = new Hashtable { { "XMSC_IC_URL", bindingsFilePath } };
InitialContext jndi = new InitialContext(aHashtable);
//Java Naming and Directory Interface (JNDI)
_queueObject = (IDestination)jndi.Lookup(queueName);
_queueManager = (IConnectionFactory)jndi.Lookup(connectionFactoryName);
_queueManager.SetStringProperty(XMSC.WMQ_SSL_PEER_NAME, string.Format("CN=\"{0}\"", sslPeerName));
_queueManager.SetIntProperty(XMSC.WMQ_CONNECTION_MODE, XMSC.WMQ_CM_CLIENT_UNMANAGED);
_queueManager.SetStringProperty(XMSC.WMQ_SSL_KEY_REPOSITORY, sslKeyRepository);
_queueManager.SetStringProperty(XMSC.WMQ_SSL_CIPHER_SPEC, "DES_SHA_EXPORT");
}
catch (Exception e)
{
}
}
public void Connect()
{
try
{
IConnection QueueConnection = _queueManager.CreateConnection();
QueueSession = QueueConnection.CreateSession(true, AcknowledgeMode.AutoAcknowledge);
IMessageConsumer QueueConsumer = QueueSession.CreateConsumer(_queueObject);
QueueConsumer.MessageListener = OnNewMessageCallback;
QueueConnection.Start();
}
catch (Exception e)
{
}
}