使用CA证书文件验证远程服务器X509Certificate我使用OpenSSL生成了CA和多个证书(由CA签名),我有一个.NET/C#客户端和服务器都使用SslStream,每个都有自己的证书/密钥,启用相互身份验证并禁用吊销。我正在使用RemoteCertificateValidationCallback验证远程服务器的SslStream证书,我希望我只能在程序中加载CA的公共证书(作为文件)并使用它来验证远程证书,而不是实际安装Windows证书存储中的CA。问题是X509Chain不会显示任何其他内容,除非我将CA安装到商店中,当我打开其中一个证书的PEM版本时,WindowsCryptoAPIshell也会显示。我的问题是,当RemoteCertificateValidationCallback、X509Certificate和X509Chain似乎没有给我任何工作时,我如何在不使用Windows证书存储或WCF的情况下使用CA的公共证书文件来验证我的特定CA是否签署了证书?由于CA证书不在根证书存储中,因此您在RemoteCertificateValidationCallback();中包含了SslPolicyErrors.RemoteCertificateChainErrors的错误标志;一种可能性是针对您自己的X509Certificate2Collection显式验证证书链,因为您没有使用本地存储。如果(sslPolicyErrors==SslPolicyErrors.RemoteCertificateChainErrors){X509Chainchain0=newX509Chain();chain0.ChainPolicy.RevocationMode=X509RevocationMode.NoCheck;//添加所有额外的证书链chain0.ChainPolicy.ExtraStore.Add(newX509Certificate2(PublicResource.my_ca));chain0.ChainPolicy.VerificationFlags=X509VerificationFlags.AllowUnknownCertificateAuthority;isValid=chain0.Build((X509Certificate2)证书);您还可以重用回调中传递的链,在ExtraStore集合中添加额外的证书,并使用AllowUnknownCertificateAuthority标志进行验证,因为您向链中添加了不受信任的证书。您还可以通过在受信任的根存储中以编程方式添加CA证书来防止原始错误(当然,它会打开一个弹出窗口,因为在全局范围内添加一个新的受信任的CA根是一个主要的安全问题):varstore=newX509Store(StoreName.Root,StoreLocation.CurrentUser);store.Open(OpenFlags.ReadWrite);X509Certificate2ca_cert=newX509Certificate2(PublicResource.my_ca);store.Add(ca_cert);商店。关闭();编辑:对于那些想要用您的CA干净地测试链的人:另一种可能性是使用库BouncyCastle来构建证书链并验证信任。选项清晰,错误易于理解。成功时,它构建链,否则返回异常。示例如下://rootCerts:CA的集合//currentCertificate:你要测试的那个varbuilderParams=newPkixBuilderParameters(rootCerts,newX509CertStoreSelector{Certificate=currentCertificate});//crls:证书撤销列表EnbuilderParams.IsRevo=.Count!=0;//验证日期:可能是“现在”builderParams.Date=newDateTimeObject(validationDate);//中间证书是创建证书链所必需的项目builderParams.AddStore(X509StoreFactory.Create("CRL/Collection",newX509CollectionStoreParameters(crls)));尝试{PkixCertPathBuilderResult结果=builder.Build(builderParams);投掷();...当RemoteCertificateValidationCallback、X509Certificate和X509Chain似乎没有给我任何工作时,如何在不使用Windows证书存储或WCF的情况下使用CA的公共证书文件来验证我的特定CA是否具有签名证书?下面的代码将避开Windows证书存储和验证链它与JB的代码略有不同,尤其是在使用标志时。下面的代码不需要AllowUnknownCertificateAuthority(但它确实使用了X509RevocationMode.NoCheck,因为我没有CRL)。函数的名称无关紧要。下面,VerifyServerCertificate与SslStream类中的RemoteCertificateValidationCallback相同。您还可以将它用于ServicePointManager的ServerCertificateValidationCallback。staticboolVerifyServerCertificate(objectsender,X509Certificatecertificate,X509Chainchain,SslPolicyErrorssslPolicyErrors){try{StringCA_FILE="ca-cert.der";}X509Certificate2ca=newX509Certificate2(CA_FILE);X509Chainchain2=newX509Chain();chain2.ChainPolicy.ExtraStore.Add(ca);//检查所有属性chain2.ChainPolicy.VerificationFlags=X509VerificationFlags.NoFlag;//此设置没有吊销信息chain2.ChainPolicy.RevocationMode=X509RevocationMode.NoCheck;//构建链chain2.(新X509Certificate2(证书));//建链有没有失败?如果(chain2.ChainStatus.Length==0)返回真;//如果有状态,验证状态是否为NoErrorboolresult=chain2.ChainStatus[0].Status==X509ChainStatusFlags.NoError;调试断言(结果==真);返回结果;}catch(Exceptionex){Console.WriteLine(ex);}返回假;默认情况下使用此链(下面的chain2),因此不需要回调。也就是说,将其安装在SSL套接字上,连接将“正常工作”。而且我还没有想出如何安装它,所以我可以将它传递给回调。也就是说,我必须为每次回调调用构建链。我认为这些是.Net中的架构缺陷,但我可能遗漏了一些明显的东西。以上就是C#学习教程:使用CA证书文件验证远程服务器X509Certificate共享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处:
