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

时间:2015-01-25 09:23:03

标签: ssl wireshark visualforce client-certificates force.com

我已经在force.com平台上部署了一个应用程序, 我试图为其配置双向SSL。

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

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

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

任何人都可以指出我应该在服务器中问好吗?或者在另一个数据包捕获中?

提前致谢。

enter image description here

客户密钥交换记录:

enter image description here

3 个答案:

答案 0 :(得分:5)

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

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

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

客户端需要找到一个客户端证书,通过这种方式可以构建一个链接到这些DN的链接。在最简单的情况下,可以使用由此类DN发布的客户端证书。否则,客户端可能必须构建从客户端证书到这样的DN的链,它需要具有必要的中间CA证书才能这样做。 (如何完成这取决于客户端的配置机制。)

如果需要中间CA证书且客户端不可用,您可能需要将服务器配置为接受它们并在Certificate Request中宣传它们。

答案 1 :(得分:4)

  

添加了握手捕获的屏幕截图。你能指点我应该去哪儿吗? -

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

答案 2 :(得分:1)

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

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

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

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

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

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

以下是我在研究过程中发现的一些相关页面: