我们的应用程序当前使用openssl(http://www.openssl.org/docs/crypto/X509_verify_cert.html)验证非托管代码中的服务器证书。我们正在将其转移到托管代码中。我已将X509证书整理到托管端,但如何在C#中验证该证书?
a)是否有一种简单的方法可以针对当前安装的受信任根证明该证书?
b)如果没有,验证的手动流程是什么?它是在某处记录的吗?
我已经在Mono.Security.X509中探索了这些类,它为我提供了使用证书和商店的工具,但是我无法连接点。
答案 0 :(得分:5)
举一个简单的例子,我们可以使用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
)。
据我所知,这是一个很好的基本解决方案。