我正在尝试使用安全的SSL连接连接到远程队列。我有第三方提供的有关SSL连接和队列经理详细信息的所有详细信息。我在Windows机器上安装了MQ客户端的V8版。
SSL文件夹,该文件夹已共享JKS,KDB,RDB和STH文件。
我正在使用以下代码来初始化.NET Console Application
中的属性 const string SslKeyRepository = @"ssl folder location with key name included";
const string CipherSpec = "TLS_RSA_WITH_3DES_EDE_CBC_SHA";
const string CipherSuite = "SSL_RSA_WITH_3DES_EDE_CBC_SHA";
const string SslPeerName = "Peername";
const string ConnectionType = MQC.TRANSPORT_MQSERIES_CLIENT;
static Hashtable init(String connectionType)
{
Hashtable connectionProperties = new Hashtable
{
{MQC.TRANSPORT_PROPERTY, connectionType},
{MQC.PORT_PROPERTY, 1496},
{MQC.SSL_CERT_STORE_PROPERTY, SslKeyRepository},
{MQC.SSL_CIPHER_SPEC_PROPERTY, CipherSpec},
{MQC.SSL_PEER_NAME_PROPERTY, $"CN="{SslPeerName}""}
};
// Add the connection type
// SSL
// Set up the rest of the connection properties, based on the
// connection type requested
switch (connectionType)
{
case MQC.TRANSPORT_MQSERIES_BINDINGS:
break;
case MQC.TRANSPORT_MQSERIES_CLIENT:
case MQC.TRANSPORT_MQSERIES_XACLIENT:
case MQC.TRANSPORT_MQSERIES_MANAGED:
connectionProperties.Add(MQC.HOST_NAME_PROPERTY, HostName);
connectionProperties.Add(MQC.CHANNEL_PROPERTY, Channel);
break;
}
return connectionProperties;
}
我尝试过几件事,但最终得到了例外" mqrc_ssl_initialization_error"
如果您能帮助我,我将不胜感激。
MQRC_SSL_INITIALIZATION_ERROR
的原因很多。其中一些是机械问题,例如是否可以访问密钥库文件。有些是程序性的,例如握手是否失败。诊断的最佳方法是有条不紊地检查配置,然后进行差异测试。
在其中的第一部分中,执行以下检查。如果您已经这样做了,请不要偷工减料。再做一次。
- 通过针对KDB发出
runmqakm -cert -list
来验证证书是否可以验证结构上完整并且使用适当的密码显示存储文件。 - 验证KDB文件不在世界可读目录中,是该文件不标记为世界可读。
- 验证运行该应用程序的服务帐户是KDB文件的所有者,并包含文件夹并具有写入访问权限。(不确定为什么但是GSKIT坚持认为KDB必须在运行时写。)
- 问题
runmqakm -cert -details
要验证与队列管理器相对应的证书存在和详细信息。如果QMGR使用自签名证书,则只有一个。如果QMGR使用CA签名的证书,则应有一个中间签名和根签名。 - 从第三方找出他们是否已指定
SSLCAUTH(OPTIONAL)
或SSLCAUTH(REQUIRED)
。如果OPTIONAL
,则KDB应该没有个人证书,只有签名者。如果REQUIRED
,则KDB 必须具有个人证书,并且在较低情况下标签必须为ibmwebspheremq[serviceaccount]
。
对于差分测试,请尝试以下一些测试:
- 通过使用TLS连接到本地QMGR测试应用程序(注意:MQ多年来都没有使用SSL。现在是TLS。但是,旧字段名称仍然保留SSL标签。)直到您知道是正确配置的。去获取用于开发人员的MQ Advanced的副本,您可以使用自己的QMGR在桌面上进行集成测试,免费提供全部许可。
- 使用示例程序之一进行测试。使用
amqsputc
或amqsgetc
,具体取决于真正的应用程序是否应该在队列上具有PUT
还是GET
。这些使用相同的KDB,Samme证书等。主要区别是它们是众所周知的代码。 - 要求您的业务合作伙伴让您在没有SSL的情况下进行测试,以确保配置的"机械"部分正确。这包括诸如防火墙路由,主机,端口和频道名称,QMGR名称等。
- 一旦有效,请使用启用SSL测试,并在QMGR上设置
SSLCAUTH(OPTIONAL)
。这表明客户可以验证QMGR的证书 - 一旦有效,如果目标是使用相互认证,请在QMGR上设置
SSLCAUTH(REQUIRED)
和本地KDB中的个人证书。这表明QMGR可以验证客户的证书 - 然后,只有这样,在本地打开
SSLPEER
以在QMGR证书的DN上过滤。
如果这些无济于事,请通过测试的详细结果更新问题。最常见的问题包括证书标签和KDB权限。如果业务伙伴给您JK和KDB,则通常应该不带有个人证书,只有可信赖的证书。