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

标签 ssl mono x509certificate x509 xamarin.mac

我们的应用程序目前使用 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/

相关文章:

c++ - 如何在 C++ 中测试公钥/私钥对?

php - 在 Centos 8 上使用 ODBC 17 和 Laravel 连接到 SQL Server 时出现 SSL 错误 'dh key is too small'

java - 将带有 Hibernate 的 Vaadin App 连接到 Azure 上的 MariaDB 时如何使用 SSL 加密

ssl - WSO2 API Manager 如何配置自定义域和 SSL

SSL CRL 过期问题

.net - IPC 单声道 <-> .NET?

c# - 如何编译单声道源代码

ssl - x509 证书如何知道链接到私钥?

java.io.IOException : Short read of DER length

c# - 在 Linux 中使用 Windows 窗体编译 C# 代码