我已经在force.com平台上部署了一个应用程序, 我试图为其配置双向SSL。
即。 我希望每次从SF发送到我的服务器的请求都会发送一个客户端证书。
我在SF上进行了必要的配置以便发送证书,但是我仍然从服务器获得403.7,这意味着:禁止,需要客户端证书。
我在服务器上安装了wireshark,捕获了流量以查看2路ssl握手,并且我试图在服务器hello消息中找到它告诉客户端客户端证书应该与之对应的可信CA,但我很难找到它。 我怀疑客户端不发送证书的原因。
任何人都可以指出我应该在服务器中问好吗?或者在另一个数据包捕获中?
提前致谢。
客户密钥交换记录:
答案 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(?)中的另一个线程可能无法访问用于协商的证书。
以下是我在研究过程中发现的一些相关页面: