- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的机器上有两种类型的证书,一种是 A1,另一种是 A3,当将其中一种加载到 X509Certificate2
对象时,我如何以编程方式检测它是 A1 还是 A3?
我了解到如果不插入A3证书,则无法访问私钥。考虑到两个证书均有效/已安装并已插入。
我刚刚发现 A1
和 A3
类型是由特定国家/地区立法(巴西)定义的,所以让我来解释一下它们之间的区别:
ICP-Brasil允许8种数字证书,分为2个系列(A和S)。
The A series (A1, A2, A3 and 4) consists of digital signature certificates, used for Web identity verification, e-mail, virtual private networks (VPNs), and electronic documents with verification of the integrity of their Information.
The S series (S1, S2, S3 and S4) includes the certificates of confidentiality, which are used in the codification of documents, databases, messages and other confidential electronic information. The eight types are differentiated by use, security level and validity.
(Gisele Ribeiro, Source)
因此,为了更新我的问题,我希望检测证书是否来自具有 key 生成功能的智能卡。
最佳答案
大概您的 A1 和 A3 命名法是关于巴西标准的(e-CPF/e-CNPJ/类似的东西)。据我所知,这些术语的意思是:
(我真的很好奇 A2 是什么,但我离题了)。
从技术上讲,证书不知道它们的 key 在哪里。因此,证书不知道其私钥(无论在何处)是基于硬件还是基于软件。但是,基于 http://www.bcb.gov.br/sfn/ced/ManualdeSeguran%C7adaRSFN-v32.pdf和 http://oid-info.com/get/2.16.76.1.2 ,看起来你可以按照以下方式做一些事情:
private static bool IsBrazilA1Certificate(X509Certificate2 cert)
{
// End with the "." so it matches on children, but not that OID.
return HasParentEku(cert, "2.16.76.1.2.1.");
}
private static bool IsBrazilA3Certificate(X509Certificate2 cert)
{
// End with the "." so it matches on children, but not that OID.
return HasParentEku(cert, "2.16.76.1.2.3.");
}
private static bool HasParentEku(X509Certificate2 cert, string oidFragment)
{
var ekuExtension = (X509EnhancedKeyUsageExtension) cert.Extensions["2.5.29.37"];
if (ekuExtension == null)
{
return false;
}
foreach (Oid eku in ekuExtension.EnhancedKeyUsages)
{
if (eku.Value.StartsWith(oidFragment))
{
return true;
}
}
return false;
}
因为我没有巴西 A1 或 A3 证书,所以我无法真正测试它,但这是我能从描述中得出的最好结果。否则你会问“这有私钥吗?” (cert.HasPrivateKey
) 和“私钥是否有硬件支持?” (一个更难的问题)。
编辑: 上面的代码没有遵循 EKU 验证的正常规则,这毫无意义。通常,完全没有 EKU 扩展的证书被视为具有所有 EKU。但由于您正在明确寻找根据巴西 A1 或 A3 政策创建的内容,因此它符合您的要求。 (此外,这是我见过的唯一一次必须使用基于 StartsWith 的规则来验证任何内容,通常策略是特定的 EKU OID)
关于c# - 如何检测证书的类型(A1 或 A3)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41492636/
我是一名优秀的程序员,十分优秀!