WCF证书链,以编程方式验证

我试图以编程方式使用证书,而不是使用商店。 我使用文件名和密码创建X509Certificate2

当我手动将根证书添加到“受信任的人”中的证书存储区时,此工作正常。 但是,我宁愿不必在每次部署时都这样做 - 我宁愿以编程方式处理它。

当我从证书存储中删除根证书时,我收到一个异常。

我读过的一切似乎都说我必须手动将根证书添加到证书存储区,否则信任链将无法工作。

问题:是否有编程方式来设置信任链,因此我不必手动执行此操作?

代码如下所示:

        var serverCert = new X509Certificate2("FullPathToMyCertificate.cer", "Password");
        Client.ClientCredentials.ServiceCertificate.DefaultCertificate = serverCert;

我尝试使用客户端时发生的异常是:

System.IdentityModel.Tokens.SecurityTokenValidationException 

The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US is not in the trusted people store. 
The X.509 certificate CN=notrealcertname, OU=TPA, OU=BMP, OU=Projects, O=Somebody, C=US chain building failed. 
The certificate that was used has a trust chain that cannot be verified. 
Replace the certificate or change the certificateValidationMode. 
A certificate chain could not be built to a trusted root authority.

所使用的组件默认验证链 - 当链无法验证时,您会得到该异常。 如果你想做所有事情,包括验证代码中的链,那么你需要实现“自定义验证”并将其集成到WCF主机中:

Client.ServiceCertificate.Authentication.CertificateValidationMode =
              X509CertificateValidationMode.Custom;
Client.ServiceCertificate.Authentication.CustomCertificateValidator =
    new MyCertificateValidator();

另一个选择是完全禁用验证( 不适用于生产!!!

Client.ServiceCertificate.Authentication.CertificateValidationMode =
              X509CertificateValidationMode.None;

编辑 - 评论后:

为了验证自己的链,你应该看看X509Chain和X509Store - 了解如何实现这样的链验证,看看Mono的Verify实现...基本上你使用Find方法来搜索X509Certificate2Collection for父母等等......自定义验证的验证标准取决于您(有效签名,未过期...)。

MSDN中的一些参考链接:

  • http://msdn.microsoft.com/en-us/library/system.servicemodel.security.x509servicecertificateauthentication.certificatevalidationmode.aspx

  • http://msdn.microsoft.com/en-us/library/system.identitymodel.selectors.x509certificatevalidator.aspx

  • http://msdn.microsoft.com/en-us/library/ms733806.aspx

  • 链接地址: http://www.djcxy.com/p/54617.html

    上一篇: WCF Certificate Chain, verify programmatically

    下一篇: Display Custom Information on Lock Screen In Android