gpt4 book ai didi

c# - 根据自签名证书颁发机构验证服务器证书

转载 作者:太空狗 更新时间:2023-10-29 23:07:03 25 4
gpt4 key购买 nike

我有自定义服务器/客户端应用程序,它们使用 SSL 加密的 TCP 连接(自定义协议(protocol))相互通信。为了设置服务器证书,我创建了一个自签名证书颁发机构,并使用它来签署证书供服务器使用。在客户端,我想验证我正在连接的服务器的证书是由我的自签名 CA 签名的。

通过使用 load_verify_file() 函数为 ssl::context 提供自签名 CA 证书,我能够通过 boost 在 C++ 中实现此功能。我想在 C# 客户端中实现相同的功能,但 .NET SSL 似乎对信任不在 Windows 信任库中的证书更加严格。

到目前为止,我在搜索中找到了几个部分解决方案。显然 X509Chain is the class to use to verify SSL certificates .我试过代码like this但是手动创建的链仍然提示根证书不受信任,就像传递到验证功能的原始链一样。有一个选项 ignore unknown certificate authorities ,但这似乎意味着它将接受任何自签名证书,这绝对不是我想要的。

这是似乎最接近我想要的代码,但如上所述,我遇到的问题是它仍然提示我添加到 ExtraStore 的证书是自签名的。有什么方法可以说服 X509Chain 信任我提供的证书吗?

bool remoteCertificateValidationCallback(
object sender, X509Certificate certificate, X509Chain chain,
SslPolicyErrors sslPolicyErrors)
{
// make sure certificate was signed by our CA cert
X509Chain verify = new X509Chain();
verify.ChainPolicy.ExtraStore.Add(secureClient.CertificateAuthority); // add CA cert for verification
//verify.ChainPolicy.VerificationFlags = X509VerificationFlags.AllowUnknownCertificateAuthority; // this accepts too many certificates
verify.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; // no revocation checking
verify.ChainPolicy.RevocationFlag = X509RevocationFlag.ExcludeRoot;
if (verify.Build(new X509Certificate2(certificate)))
{
return true; // success?
}
return false;
}

最佳答案

我怀疑您的私有(private) CA 证书未安装在当前系统(您运行代码的系统)上,或者安装不正确。根 CA 证书必须安装在 Computer stire 的受信任根 CA 容器中,而不是当前用户存储中。默认情况下,X509Chain 使用计算机商店查找可信 anchor 。

此外,您的代码没有执行您想要的操作。它将接受并通过任何公开信任的根 CA。相反,您需要比较 X509Chain.ChainElements 中的最后一个元素,以确定包含的证书是否是您期望的证书(通过比较指纹值)。 foolowing 修复应该适用:

if (verify.Build(new X509Certificate2(certificate)))
{
return verify.ChainElements[verify.ChainElements.Count - 1]
.Certificate.Thumbprint == cacert.thumbprint; // success?
}
return false;

cacert 是您的根 CA 证书。

关于c# - 根据自签名证书颁发机构验证服务器证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27307322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com