尽管受信任的根CA,WCF错误“X.509证书链构建失败”

时间:2013-08-13 12:28:42

标签: wcf certificate

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

X.509证书CN =农场连锁建筑失败。使用的证书具有无法验证的信任链。替换证书或更改certificateValidationMode。已处理证书链,但终止于信任不信任的根证书。

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

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

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

从错误消息中我可能会认为证书链中有一个我的证书有错误,但没有。有什么想法吗?

更新

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

3 个答案:

答案 0 :(得分:1)

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

在服务器上,确保根证书位于计算机的“本地计算机”一侧,而不是“当前用户”。另一件事是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

这是复杂,乏味的事情。你必须坚持下去。

答案 1 :(得分:1)

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

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

下一个错误是"撤销功能无法检查证书的撤销"

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

我还将服务器和客户端证书的撤销检查模式设置为“脱机”。

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

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

答案 2 :(得分:1)

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

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

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

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

或只是转动撤销列表检查:

...RevocationMode = X509RevocationMode.NoCheck;