【问题标题】:WCF error "The X.509 certificate chain building failed" despite trusted root CA尽管受信任的根 CA,但 WCF 错误“X.509 证书链构建失败”
【发布时间】:2013-08-13 12:28:42
【问题描述】:

我收到了this question 中提到的错误:

X.509 证书 CN=Farm 链构建失败。使用的证书具有无法验证的信任链。更换证书或更改 certificateValidationMode。已处理的证书链,但以不受信任的根证书终止。

我不明白为什么会收到此错误,因为我添加了用于向 WCF 服务请求的证书,如下所示:

client.ClientCredentials.Peer.PeerAuthentication.CertificateValidationMode =     
    X509CertificateValidationMode.ChainTrust;        
client.ClientCredentials.ClientCertificate.SetCertificate(
    StoreLocation.CurrentUser,
    StoreName.My,
    X509FindType.FindBySerialNumber,
    "MyCertificatesSerialNumber" );

证书本身是上面显示的商店中的自签名证书。当我点击它显示证书路径时,没有显示错误(根证书也是自签名证书)。根证书已手动导入受信任的根证书颁发机构

从错误消息中,我预计我的一个证书的认证链中存在错误,但没有。有什么想法吗?

更新

我使用 Internet Explorer 9 作为浏览器来访问网络服务。我以编程方式使用 C# 控制台应用程序。

【问题讨论】:

  • 参见第 2 步 blogs.msdn.com/b/jpsanders/archive/2009/09/16/… 确保它在正确的商店中。如果 WCF 服务在 IIS 中运行,则“我的”存储将是应用程序池标识,而不是您。
  • @ta.speot.is 现在我正在尝试通过控制台应用程序从不同的系统访问 Web 服务。使用浏览器,我访问 web 服务没有任何问题,但是运行控制台应用程序(在与浏览器相同的登录用户帐户下)我收到错误消息。即使您链接中提到的步骤与我当前的设置无关,我还是将用户的证书添加到了相应计算机的商店,结果与以前相同。
  • 如果你的证书是自签名的,它怎么会有根呢?另外,你用的是什么浏览器? Firefox 有自己的受信任证书存储区,Windows 不共享该证书存储区。 IE 和 Chrome 使用 Windows 信任库。
  • @gtrig:我不明白你的问题。当然,自签名证书可以有根,您可以在证书路径中看到这一点。
  • @Gorgsenegger:证书路径或链由最终(叶)证书和签署它的证书实体以及签署该证书的证书实体组成,依此类推,直到自签名根。如果您的证书是自签名的,则没有其他证书实体对其进行签名,并且路径中不会出现其他证书。如果路径中确实出现了其他证书,那么您的证书不是自签名的。

标签: wcf certificate


【解决方案1】:

我遇到了完全相同的问题 - 我自己的受信任根 CA 签署了另一个证书。证书存储中未显示任何错误。

事实证明,拥有受信任的根 CA 和证书是不够的!您还需要证书吊销列表!看看这个MSDN Link

所以只需创建这样一个 .crl 并将其添加到受信任的根证书颁发机构,一切正常!

makecert -crl -n "CN=CARoot" -r -sv CARoot.pvk CARoot.crl

或者干脆关闭撤销列表检查:

...RevocationMode = X509RevocationMode.NoCheck;

【讨论】:

    【解决方案2】:

    我遇到了这个问题 - 这是我的建议:

    在服务器上,确保根证书位于计算机的“本地计算机”端,而不是“当前用户”端。另一件事是 SSL 证书需要从根证书派生。我最终使用包含这些行的脚本完成了所有工作:

    rem creates root authority file and cert in localmachine\root and gives it the right to sign certs 
    makecert.exe -a sha1 -n CN=RootCert RootCertName -sr LocalMachine -ss Root -sky signature -pe -r -sk MyNewKey -cy authority  
    
    rem creates ssl cert, puts it in the currentuser\Personal store, signing it based on the root cert
    makecert.exe  -n cn=HostURL SSLCertName -is root -ic RootCertName  -sky exchange -pe -sv SSLCertPrivateKeyName -eku 1.3.6.1.5.5.7.3.1
    

    这是复杂而乏味的事情。你只需要坚持下去。

    【讨论】:

      【解决方案3】:

      我在尝试使用 net.tcp 绑定连接到自托管 WCF 服务时遇到了类似的问题。我已经在 CurrentUser 证书存储中安装了自签名根 CA 证书,客户端正在使用由根 CA 证书签名的证书。

      在 LocalComputer 证书存储中安装根 CA 证书修复了错误“无法将证书链构建到受信任的根颁发机构”。我的 WCF 服务器进程使用当前用户帐户运行,因此这一步并不明显。

      下一个错误是“吊销功能无法检查证书的吊销”

      为了解决这个问题,我为根 CA 证书创建了一个空的证书吊销列表,然后在 LocalComputer 证书存储中安装了 CRL。 (详情请查看此链接:https://msdn.microsoft.com/en-us/library/ff648732.aspx

      我还将服务器和客户端证书的吊销检查模式设置为离线。

      defaultCredentials.ServiceCertificate.Authentication.RevocationMode = X509RevocationMode.Offline;
                  defaultCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
                      X509CertificateValidationMode.ChainTrust;
      

      现在我不必关闭证书验证或使用不同的验证模式进行开发(在我的情况下,生产代码暂时也将使用自签名证书)

      【讨论】:

        猜你喜欢
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-20
        相关资源
        最近更新 更多