gpt4 book ai didi

ssl - 在 Mono 上验证 x509 证书(OS X 可信根)

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:23 26 4
gpt4 key购买 nike

我们的应用程序目前使用 openssl ( http://www.openssl.org/docs/crypto/X509_verify_cert.html) 在非托管代码中验证服务器证书。我们正在将其转移到托管代码中。我已将 X509 证书编码到托管端,但如何在 C# 中验证该证书?

a) 是否有一种简单的方法来根据当前安装的受信任根验证该证书?

b) 如果不是,验证的手动过程是什么?它是否记录在某处?

我探索了 Mono.Security.X509 中的类,它们为我提供了处理证书和存储的工具,但我无法将这些点联系起来。


编辑我在下面添加了我的最终解决方案。我欢迎对该方法的进一步反馈。

最佳答案

根据信息herehere ,我确定以下内容:

  • 理想情况下,我们应该检查证书吊销,但这很重要,似乎不值得付出努力
  • 至少我们可以检查证书是否是最新的并且链是可信的
  • 如果我们愿意,我们还可以验证应用程序特定的事情,例如证书是否是自签名的等

举个简单的例子,我们可以使用 Mono X509Chain 来构建证书链并根据用户信任的根验证它:

var x509 = new Mono.Security.X509.X509Certificate(certificateBytes);
var chain = new Mono.Security.X509.X509Chain();
bool certificateStatus = chain.Build(x509);

通过检查 Mono 源代码,我可以看到这会检查证书链上的信任以及证书上的日期。但是,证书吊销并未实现。

我们还会检查证书上的名称是否与用户连接的主机名称相匹配。 .NET 框架为我们提供了一种获取该信息的简单方法:

var x5092 = new System.Security.Cryptography.X509Certificates.X509Certificate2(certificateBytes);
string hostName = x5092.GetNameInfo(System.Security.Cryptography.X509Certificates.X509NameType.DnsName, false);
bool hostNameMatch = string.Compare(hostName, this.Server, true) == 0;

证书也可以有应该检查的替代名称,但是使用 X509NameType.DnsAlternativeName 似乎没有在 Mono 上实现(它被硬编码为返回 string.Empty).

据我所知,这是一个很好的基本解决方案。

关于ssl - 在 Mono 上验证 x509 证书(OS X 可信根),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20360124/

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