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

时间:2013-12-03 19:40:28

标签: ssl mono x509certificate x509 xamarin.mac

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

a)是否有一种简单的方法可以针对当前安装的受信任根证明该证书?

b)如果没有,验证的手动流程是什么?它是在某处记录的吗?

我已经在Mono.Security.X509中探索了这些类,它为我提供了使用证书和商店的工具,但是我无法连接点。


编辑我在下面添加了我的终极解决方案。我希望有关该方法的进一步反馈。

1 个答案:

答案 0 :(得分:5)

根据信息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)。

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