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

 无为南子_274 发布于 2023-02-13 10:04

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

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

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

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


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

1 个回答
  • 根据此处和此处的信息,我确定以下内容:

    理想情况下,我们应该检查证书撤销,但这是非平凡的,似乎不值得努力

    我们至少可以检查证书是否是最新的,并且链是可信的

    如果我们希望我们也可以验证应用程序特定的事情,例如证书是否是自签名的等等

    举一个简单的例子,我们可以使用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).

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

    2023-02-13 10:05 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有