我们的应用目前使用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
).
据我所知,这是一个很好的基本解决方案.