在 c# 中信任存储在 "Trusted Root Certification Authorities" 中的 SSL 证书

Trusting SSL certificates stored in "Trusted Root Certification Authorities" in c#

上下文:

我正在尝试使用 ADFS SSO 进行试验,并按照本教程首先连接到 Azure AD:

http://www.cloudidentity.com/blog/2013/10/25/securing-a-web-api-with-adfs-on-ws2012-r2-got-even-easier/

有效。

然后按照其他教程尝试使其连接到我们的 Win Server 2012 R2 上的 ADFS:

http://www.cloudidentity.com/blog/2013/10/25/securing-a-web-api-with-adfs-on-ws2012-r2-got-even-easier/

正如他们在第 3 个教程中所说: https://msdn.microsoft.com/en-us/library/dn660967.aspx

我收到 SSL 证书错误:

问题:

我知道我可以绕过证书验证或在 ServicePointManager.ServerCertificateValidationCallback 中添加特殊逻辑来解决这个问题,但是因为我在本地计算机中导入了证书 "Trusted Root Certification Authorities"...:[=​​15=]

  1. ...为什么我的服务还在抱怨证书?

  2. ...有没有办法告诉我的 C# 服务接受所有证书 在 "Trusted Root Certification Authorities" 商店?

注意:我确实实现了 ServicePointManager.ServerCertificateValidationCallback 并且可以正常工作,但是因为我们会有一大群客户向我们发送他们的 ADFS 证书,所以我只想必须在证书库中导入他们的证书才能让我们的服务信任他们。

谢谢

您应该将根证书放入受信任的根证书颁发机构存储区(而不是证书本身)。如果您打开证书并转到证书路径,您将能够查看根证书。

进一步解释:

每个证书都有一个颁发者,这个颁发者也有一个证书。

通常颁发者是证书颁发机构 (CA)。

此类(CA 的)证书可能由 CA 本身(自签名)或另一个父 CA 签名。

所以你在这里有 parent/child 关系。根证书是根颁发者的证书,即 parent/grandparent 其中的证书是自签名的。

在此示例中,管理员证书由 CA 签名。并且 CA 证书是自签名的。在这种情况下,您可能希望将 CA 证书安装到受信任的根证书颁发机构存储区。

在证书验证方面,还有其他因素在发挥作用。例如,证书有一个过期数据,超过该数据将被视为无效。