我们的应用程序目前使用 openssl ( http://www.openssl.org/docs/crypto/X509_verify_cert.html) 在非托管代码中验证服务器证书。我们正在将其转移到托管代码中。我已将 X509 证书编码到托管端,但如何在 C# 中验证该证书?
a) 是否有一种简单的方法来根据当前安装的受信任根验证该证书?
b) 如果不是,验证的手动过程是什么?它是否记录在某处?
我探索了 Mono.Security.X509 中的类,它们为我提供了处理证书和存储的工具,但我无法将这些点联系起来。
编辑我在下面添加了我的最终解决方案。我欢迎对该方法的进一步反馈。
最佳答案
- 理想情况下,我们应该检查证书吊销,但这很重要,似乎不值得付出努力
- 至少我们可以检查证书是否是最新的并且链是可信的
- 如果我们愿意,我们还可以验证应用程序特定的事情,例如证书是否是自签名的等
举个简单的例子,我们可以使用 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/