c# - 在 C# 中验证 CAcert 证书

标签 c# ssl certificate

我目前正在创建一个 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/

相关文章:

c# - 使用触发器作为资源

c# - 为属性设置默认值

java - jndi LDAPS 自定义 HostnameVerifier 和 TrustManager

php - 身份验证系统是否需要 ssl?

authentication - SSL 客户端证书窗口

c# - 如何更新或删除一个表中的数据并在另一表中反射(reflect)该更改

c# - CA1023背后的原因是什么

Gitlab 代理 SSL (Docker) 证书验证失败

duplicates - 可执行文件使用无效权利进行签名 (0xE8008016)

certificate - keystore 文件中没有名称别名 (P12)