3

我收到了这个问题中提到的错误:

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# 控制台应用程序。

4

3 回答 3

3

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

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

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

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

或者干脆打开撤销列表检查:

...RevocationMode = X509RevocationMode.NoCheck;
于 2017-12-06T15:02:19.283 回答
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

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

于 2013-08-13T12:47:04.987 回答
1

在尝试使用 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;

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

于 2016-04-04T11:36:33.837 回答