gpt4 book ai didi

c# - 如何检测证书的类型(A1 或 A3)?

转载 作者:太空狗 更新时间:2023-10-29 22:36:08 25 4
gpt4 key购买 nike

我的机器上有两种类型的证书,一种是 A1,另一种是 A3,当将其中一种加载到 X509Certificate2 对象时,我如何以编程方式检测它是 A1 还是 A3?

我了解到如果不插入A3证书,则无法访问私钥。考虑到两个证书均有效/已安装并已插入。

编辑

我刚刚发现 A1A3 类型是由特定国家/地区立法(巴西)定义的,所以让我来解释一下它们之间的区别:

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)

Types of certificate

因此,为了更新我的问题,我希望检测证书是否来自具有 key 生成功能的智能卡。

最佳答案

大概您的 A1 和 A3 命名法是关于巴西标准的(e-CPF/e-CNPJ/类似的东西)。据我所知,这些术语的意思是:

  • A1:软件私钥
  • A3:硬件私钥

(我真的很好奇 A2 是什么,但我离题了)。

从技术上讲,证书不知道它们的 key 在哪里。因此,证书不知道其私钥(无论在何处)是基于硬件还是基于软件。但是,基于 http://www.bcb.gov.br/sfn/ced/ManualdeSeguran%C7adaRSFN-v32.pdfhttp://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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com