IBM Webshpere MQ客户端使用SSL连接远程队列
问题描述:
我正尝试使用安全SSL连接来连接远程队列。我有第三方提供的有关SSL连接和队列管理器详细信息的所有详细信息。我的Windows机器上安装了MQ客户机的V8版本。IBM Webshpere MQ客户端使用SSL连接远程队列
第三方共享的SSL文件夹包含jks,kdb,rdb和sth文件。
我使用下面的代码来初始化
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;
}
我已经试过几件事情在.NET控制台应用程序的属性,但我最终得到例外“MQRC_SSL_INITIALIZATION_ERROR”
我将不胜感激,如果你可以帮助我。
答
有很多原因。其中一些是机械问题,例如是否可以访问密钥库文件。有些是程序性的,例如握手是否失败。最好的诊断方法是系统地检查配置,然后执行差异测试。
对于第一部分,执行以下检查。如果你已经这样做,不要偷工减料。再来一遍。
- 验证证书是通过发出
runmqakm -cert -list
对KDB以验证它是结构完整和存储文件存在与正确的密码访问。 - 确认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 for Developers的副本,你可以使用你自己的QMgr在桌面上进行集成测试,完全免费授权。
- 使用其中一个示例程序进行测试。使用
amqsputc
或amqsgetc
,具体取决于队列上的真实应用是否应该有PUT
或GET
。这些使用相同的KDB,samme证书等,主要区别在于它们是已知的良好代码。 - 要求您的业务伙伴允许您在没有SSL的情况下进行测试,以确保配置的“机械”部分是正确的。这包括诸如防火墙路由,主机,端口和通道名称,QMgr名称等。如果您无法连接纯文本通道,那么TLS通道肯定不会成功。
- 一旦启用,则启用SSL测试并在QMgr中设置
SSLCAUTH(OPTIONAL)
。这表明客户可以验证QMgr的证书。 - 一旦有效,并且如果目标是使用相互认证,则使用在QMgr中设置的
SSLCAUTH(REQUIRED)
以及在本地KDB中的个人证书进行测试。这表明QMgr可以验证客户的证书。 - 然后,只有在那之后,在本地打开
SSLPEER
才能过滤QMgr证书的DN。
如果这些没有帮助,请更新问题并提供详细的测试结果。最常见的问题包括证书标签和KDB权限。如果商业伙伴给了你JKS和KDB,这些应该通常而不是带有个人证书,只有可信任的证书。
+0
非常感谢您的详细解答。我会试一试。 – prashant
@prashant离线与我联系。用Peer Name来怀疑问题,格式似乎不正确。 – Shashi
@Shashi为什么它会提供与SSL有关的异常?它应该与Peer name相关。我是否需要使用特定的用户标识运行控制台应用程序?我得到了第三方的回应,说它可能是“用户标识符和密钥库文件ID不匹配” – prashant
对端名称是初始化安全通道所需的属性。对于初始化安全通道时遇到的错误,IBM MQ返回MQRC_SSL_INITIALIZATION_ERROR。您是否已与第三方确认您的应用程序设置的SSL属性是正确的? – Shashi