- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有自定义服务器/客户端应用程序,它们使用 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/
我有一个包含 JSON 数组的 JSON 文件 测试文件 [ { "Name": "Bob" }, { "Age": "37" }, { "DOB": "12/01/1985"} ] 我想
我是一名优秀的程序员,十分优秀!