我目前正在创建一个 C# 程序,它将通过 https 从我的服务器获取一些数据。有问题的服务器正在使用 CACert 证书 ( http://www.cacert.org/ ),我需要一种验证服务器证书的方法(检查主题并确保它由 cacert 根证书签名)。
我想执行此操作而不必将 CAcert 根作为受信任的 CA 导入到 Windows 证书存储中,有些人可能不喜欢那样,而且 AFAIK 需要管理员。
我目前使用的是 TcpClient 和 SslStream,而不是 WebRequest/WebResponse 类,因为有一天我可能会从使用 HTTP 转向使用我自己的协议(protocol),但如果使用 *request 类任务更容易,我会考虑使用他们。
最佳答案
首先要使用重载的 SslStream 构造函数:
SslStream(Stream innerStream, bool leaveInnerStreamOpen, RemoteCertificateValidationCallback userCertificateValidationCallback);
然后 RemoteCertificateValidationCallback 方法看起来像这样:
public bool IsValid(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
... you logic here ...
}
您只需要简单地遍历链并查看证书,直到找到您愿意通过验证公钥接受的证书:
foreach(X509ChainElement e in chain.ChainElements)
if( e.Certificate.Subject == "CN=XXX.xx" && e.Certificate.GetPublicKeyString() == "expected public key" )
return true;
关于c# - 在 C# 中验证 CAcert 证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1489069/