【问题标题】:Secure handshake failing during IBM.MQ MQQueueManager on Linux .net core在 Linux .net 核心上的 IBM.MQ MQQueueManager 期间安全握手失败
【发布时间】:2020-11-19 12:47:21
【问题描述】:

我们正在尝试使用 .net core 3.1 应用程序从 RHEL 8.3 连接到 IBM MQ。 相同的代码在 Windows 上运行正常 - 我们能够连接到 QM。
正如我们所相信的,我们正面临一个来自 openssl 的错误:

---> Interop+OpenSsl+SslException:SSL 握手失败,出现 OpenSSL 错误 - SSL_ERROR_SSL。 ---> Interop+Crypto+OpenSslCryptographicException: error:14094412:SSL routines:ssl3_read_bytes:sslv3 >alert bad certificate --- 内部异常堆栈跟踪结束 --- 在 >/_/src/Common/src/Interop/Unix/System.Security 中的 Interop.OpenSsl.DoSslHandshake(SafeSslHandle context, Byte[] recvBuf, Int32 recvOffset, Int32 >recvCount, Byte[]& sendBuf, Int32& sendCount)。 Cryptography.Native/Interop.OpenSsl.cs:line 278

我们可以看到MQClient加载了证书

00000157 12:30:07.116059 536167.15 -----------{ MQEncryptedSocket.MakeSecuredConnection()
00000158 12:30:07.116425 536167.15 创建了一个实例 SSLStreams
00000159 12:30:07.116466 536167.15 设置当前证书 存储为“用户”
0000015A 12:30:07.116528 536167.15 Linux 所以使用 My & CurrentUser
0000015B 12:30:07.116542 536167.15 创建了要访问的存储对象 证书 0000015C 12:30:07.116780 536167.15 开店
0000015D 12:30:07.116795 536167.15 访问证书 - ZZZZ
0000015E 12:30:07.230836 536167.15 证书数量 商店:5
0000015F 12:30:07.231092 536167.15 支持 TLS12 - True
00000160 12:30:07.233622 536167.15 将 SslProtol 设置为 Tls12
00000161 12:30:07.233652 536167.15 开始 SSL 认证

我们有单元测试来验证给定主题的证书是否存在于该商店中并且它通过了。
我们已经做了什么:

  1. 我们构建了 openssl 1.1.1h 并将其链接到整个系统。
  2. 我们验证了证书存储。我们使用的证书是有效的
    var cert = x509Store2.Certificates.Find(X509FindType.FindBySubjectName, mockIbmMqOptions.MqCertificateLabel, true).Count;
    x509Store2.Close();
    x509Store2.Dispose();
    Assert.True(cert > 0);
  1. 我们在 Windows 上成功运行了代码。
  2. 我们在 openssl 源代码中搜索了 sslv3 alert bad certificate,发现除了错误代码为 1420 但未引用的静态数据。

有什么想法吗?

【问题讨论】:

  • 您是否在 c# 代码中指定了 TLS 版本?当您未在客户端中指定 TLS 版本时,将使用默认版本,该版本在不同机器上可能会有所不同。此外,证书必须同时加载到客户端和服务器上。当 TLS 连接启动时,服务器向客户端发送证书名称列表,然后客户端在证书存储中查找名称。证书加密模式必须与 TLS 版本兼容。见维基:en.wikipedia.org/wiki/Transport_Layer_Security
  • 是的,我们是:00000154 12:30:07.110057 536167.15 CipherSpec value is TLS_RSA_WITH_AES_256_CBC_SHA256
  • 看起来您的客户端正在请求 TLS 1.2。并且服务器不接受证书。请参阅:ibm.com/support/knowledgecenter/SSFKSJ_9.0.0/…
  • 如何查看?它在 Windows 上工作正常。我想知道是否有一些东西可以帮助追踪问题。
  • 您的意思是要设置证书标签以匹配 .net 核心密钥库中的名称吗?另一个最近的question 可能会有所帮助。

标签: c# linux openssl ibm-mq .net-standard-2.0


【解决方案1】:

感谢@JoshMc 基于this question 我们成功地完成了握手。 我认为这是 .net core 在 RHEL 和 IBM MQ 客户端库上的通用解决方案:

  1. 确保 CA 和中间 CA 存储在 /usr/share/pki/ca-trust-source/anchors/ 或 /etc/pki/ca-trust/source/anchors/ 中
  2. 如果您的 pfx 在证书路径中包含证书仅导出私钥和公共证书
  3. 确保将友好名称设置为某个值。
  4. 将导出的 pfx 添加到 .net 核心密钥库 certificate-tool add
  1. 设置 CertificateLabel 以匹配 FriendlyName 或将友好名称设置为 ibmwebspheremq

【讨论】:

  • 您也可以将友好名称设置为 ibmwebspheremq<username_in_lowercase> 并跳过将 CertificateLabel 设置为匹配。
  • 还有 20 小时 :)
猜你喜欢
  • 1970-01-01
  • 2021-06-03
  • 1970-01-01
  • 2020-02-11
  • 2016-03-15
  • 2020-07-09
  • 1970-01-01
  • 2019-08-04
  • 2017-02-12
相关资源
最近更新 更多