2 向 SSL - 客户端证书未发送到服务器

2 Way SSL - Client Certificate Not Sent To Server

我在 force.com 平台上部署了一个应用程序到 salesforce, 我正在尝试为其配置 2 路 SSL。

即 我希望对于从 SF 发送到我的服务器的每个请求,都会发送一个客户端证书。

我在 SF 上做了必要的配置以发送证书,但我仍然从服务器收到 403.7,这意味着:禁止,需要客户端证书。

我在服务器上安装了 wireshark,捕获了流量以查看 2 路 ssl 握手,我试图在服务器问候消息中找到它告诉客户端客户端证书应该对应的可信 CA,但我很难找到它。 我怀疑这就是客户端不发送证书的原因。

任何人都可以指出我应该在服务器 hello 中的哪个位置查看?或者也许在另一个数据包捕获中?

提前致谢。

客户端密钥交换记录:

Added a screenshot of the handshake captures. can you please point me to where I should be looking? –

参见数据包 #31。它包含证书请求。数据包 #33 也包含来自客户端的证书,所以原因不是客户端没有发送证书,而是服务器不喜欢证书,因为验证失败或者因为证书不足以授权请求的资源。您可能会从服务器日志中获得更多信息。

此处,服务器发送其 Certificate Request 消息,客户端发送其 Certificate 消息作为响应,但该消息包含 0 个证书。

通常,当客户端无法 select 使用客户端证书时,就会发生这种情况。要么没有正确配置以使用任何证书,要么找不到由可接受的 CA 之一颁发的证书。

查看 Certificate Request 数据包并检查其 certificate_authorities 列表。这是服务器愿意接受的 CA 可分辨名称 (DN) 的列表。

不管怎样,客户端都需要找到一个客户端证书,用它可以建立一个指向那些 DN 的链。在最简单的情况下,由这样的 DN 颁发的客户端证书是可用的。否则,客户端可能必须构建从客户端证书到此类 DN 的链,它需要具有必要的中间 CA 证书才能这样做。 (如何完成取决于客户端的配置机制。)

如果中间 CA 证书是必需的并且在客户端不可用,您可能需要配置您的服务器以接受它们并在 Certificate Request 中公布它们。

不确定这是否对其他人有帮助,但对于我们这个问题的案例,当 运行 在本地 Visual Studio 和 IIS 中时一切正常,但当部署到真实服务器时,我们如上所述,在 2 向 SSL 期间遇到证书问题并在 Wireshark 中验证。

无论如何,在那台服务器上我们还有一个 .NET 4.7.2 控制台应用程序,它调用相同的 API 并且一切正常。

但是,我们的 .NET 4.7.2 网络 API 调用失败了。似乎当 IIS 中的相同代码为 运行 时,证书在 SSL 协商期间不可用。 (虽然加载正常)

此时我们的解决方案是修改以下调用以包含第三个参数。

certificate = new X509Certificate2(certificatepath, Password, X509KeyStorageFlags.MachineKeySet);

默认情况下,X509Certificate2 使用 UserKeySet 选项,因此应用程序池用户或 IIS 中的另一个线程 (?) 可能无法访问用于协商的证书。

以下是我在研究过程中发现有用的几个相关页面: