我正在创建一个C#程序,它将从我的服务器通过https获取一些数据。有问题的服务器正在使用CAcert证书(http://www.cacert.org/),我需要一种验证服务器证书的方法(检查主题并且它由cacert根证书签名)。
我想这样做而不必将CAcert根作为可信CA导入到Windows证书库中,有些人可能不喜欢,以及需要管理员的AFAIK。
我目前正在使用TcpClient和SslStream而不是WebRequest / WebResponse类,因为有一天我可能会从使用HTTP变为使用自己的协议,但如果使用*请求类更容易,我会考虑使用它们。
答案 0 :(得分:1)
首先,您要使用重载的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;