在C#中验证CAcert证书

时间:2009-09-28 20:03:13

标签: c# ssl certificate

我正在创建一个C#程序,它将从我的服务器通过https获取一些数据。有问题的服务器正在使用CAcert证书(http://www.cacert.org/),我需要一种验证服务器证书的方法(检查主题并且它由cacert根证书签名)。

我想这样做而不必将CAcert根作为可信CA导入到Windows证书库中,有些人可能不喜欢,以及需要管理员的AFAIK。

我目前正在使用TcpClient和SslStream而不是WebRequest / WebResponse类,因为有一天我可能会从使用HTTP变为使用自己的协议,但如果使用*请求类更容易,我会考虑使用它们。

1 个答案:

答案 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;