问题标签 [x509chain]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
128 浏览

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

我正在尝试使用 .NET (4.5.2) 验证证书链X509Chain,但我的链将无法验证,因为叶证书有一个关键扩展 (Apple Pay),可能无法被底层安全引擎识别Windows 提供 .NET 框架。

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

  • 叶子中的一项ChainElementStatusStatusX509ChainStatusFlags.InvalidExtension
  • 叶子中的ChainElementStatus一项Status(X509ChainStatusFlags)0x08000000有趣的是,IDE 给它起了名字HasNotSupportedCriticalExtension,但枚举中不存在该值;我认为这是由于 .NET 框架的更改)
  • 叶子确实有一个Critical带有预期 OID 的扩展名

不过,这似乎很混乱。我宁愿告诉框架预先期待这个扩展,也不愿验证它是否由于正确的原因而失败。

我发现了这个关于如何使用 BouncyCastle 实现这一点的问题(尽管它涉及更改源),但无法找到使用内置X509Chain类执行此操作的方法。

我也找不到将这个扩展“安装”到 Windows 以使其识别的方法。

有没有办法做到这一点?或者是剥离扩展还是让框架认识到它是一个比让它失败并准确验证它为什么会失败更糟糕的“坏主意”?

0 投票
1 回答
363 浏览

c# - 证书链究竟是如何构建的?

正如标题所述,我想知道证书链是如何在内部构建的。

我有一个自签名的根证书 (CA) 和一个传入的用户证书,据说它已经由我的根签名,这是我必须测试的。可以使用 X509Certificate2.Verify() 方法测试 X509Certificate2,该方法使用具有一些标准设置的 X509Chain。为了完全控制这个过程,我直接使用 X509Chain。由于我的根未安装在机器上(不在受信任的根证书存储中),因此我将其添加到 ChainPolicy 的 ExtraStore。

整个魔法发生在 X509Chain.Build() 方法中,我通过了我的“待测试”用户证书。链得到构建,从传递的证书开始,以自签名的根结束。但具体如何?如何测试证书是否已由一个或另一个根签名?它是否在内部使用数字签名?

我试图调试整个事情,但以 DLL 导入结束,它使用来自 Libraries.Crypt32 的 CertGetCertificateChain 方法。那是 C++ 的东西,它超出了我的知识范围。

到目前为止的简化代码:

0 投票
0 回答
46 浏览

wcf - 使用 crl 文件验证客户端证书

我正在构建一个 wcf c# 服务以在 Windows Server 2012 中运行。我有一个 crl 文件 (sample.crl),我需要根据 crl 文件验证客户端证书。(我的服务器无法访问在线 crl)。即,我需要确保我的整个证书链不存在于 crl 列表中。

我尝试将crl 文件导入到“中间证书颁发机构”下的本地证书存储中。验证码看起来像这样

我相信这段代码会根据本地 crl 缓存(certutil -urlcache crl)测试证书。但是我添加到本地证书存储的 crl 并没有显示在本地 crl 缓存中。如何针对我在 C# 中本地拥有的 crl 文件实现证书验证。

0 投票
1 回答
317 浏览

c# - 如何使用 C# 检测证书链不完整的证书?C# dotnet core 说它们是有效的而不是无效的

我正在尝试编写一些代码来验证网站的证书是否有效(例如,不完整的链.badssl.com)。我遇到的这个问题是,在证书验证期间,windows(或 dotnet 框架)似乎过于有用,甚至可以修复链。当链到达我的验证证书回调函数时,链与主机服务器不同并且是有效的。有谁知道绕过似乎是cryptoapi的链修复功能并仅使用“原样”证书来验证链的方法?

我已经尝试过使用 httpclient 和 sslstream 的验证证书回调。两者都说链是有效的而不是无效的。

例如,curl 请求失败,如果证书链无效,我希望我的请求失败。

openssl 也正确地将这些不完整链显示为无效

编辑:这是使用 WebRequest 的尝试(https://dotnetfiddle.net/2aybuI

这是两个似乎有类似问题但没有解决方案的老问题。

  1. 具有不完整链的 SSL 证书,在 .NET Core 2.2 中通过验证

  2. X509Chain.Build() 方法为无效证书返回 true