在Windows或.NET中支持未知的关键X509证书扩展

在Windows或.NET中支持未知的关键X509证书扩展,.net,windows,x509,x509certificate2,x509chain,.net,Windows,X509,X509certificate2,X509chain,我试图用X509Chain验证.NET(4.5.2)中的证书链,我的链将不会验证,因为叶证书有一个关键扩展(Apple Pay),可能Windows提供的.NET framework的底层安全引擎无法识别该扩展 目前,我可以通过确保证书链的唯一错误是由此扩展引起的错误来解决此问题: 叶的chaineelementstatus中的一个项目,具有x509chainestatusflags的Status。InvalidExtension 叶的ChainElementStatus中的一项,其状态为(x

我试图用
X509Chain
验证.NET(4.5.2)中的证书链,我的链将不会验证,因为叶证书有一个关键扩展(Apple Pay),可能Windows提供的.NET framework的底层安全引擎无法识别该扩展

目前,我可以通过确保证书链的唯一错误是由此扩展引起的错误来解决此问题:

  • 叶的
    chaineelementstatus
    中的一个项目,具有
    x509chainestatusflags的
    Status
    。InvalidExtension
  • 叶的
    ChainElementStatus
    中的一项,其
    状态为
    (x509chainestatusflags)0x08000000
    (有趣的是,IDE给它命名为
    HasNotSupportedCriticalExtension
    ,但该值在枚举中不存在;我假设这是由于.NET framework的更改)
  • 该叶确实有一个带有预期OID的
    Critical
    扩展
不过,这看起来很混乱。我更愿意告诉框架预先期待这个扩展,而不是验证它是否因为正确的原因而失败

我已经找到了如何使用BouncyCastle实现这一点的方法(尽管它涉及到更改源代码),但是找不到使用内置的
X509Chain
类实现这一点的方法

我也找不到一种方法将这个扩展“安装”到Windows中,使它能够识别它


有办法做到这一点吗?或者剥离扩展或者让框架认识到这是一个比让它失败并确切验证其原因更糟糕的“坏主意”?

我认为用CryptoAPI以优雅的方式实现这一点是不可能的(
X509Chain
只是CryptoAPI上的简单包装器)。您可能需要研究BouncyCastle中可用的选项。@Crypt32是的,我自己也有这种倾向。我在BC方面有点运气(不改变源代码!),但我不想承担依赖性,而且我仍然不确定是否有一种处理扩展的“正确”方式。“正确”方式是用RFC编写的,用CryptoAPI实现的——拒绝具有未知关键扩展的cert。我知道这对你没有多大帮助,但这就是我能为你提供的一切。即使是底层CryptoAPI函数也不会公开请求的功能,因此.NET BCL不是您需要的工具,而且我在BC方面没有经验。