c# - 如何正确使用X509Store?

标签 c#

我一直在使用 X509Store和他的 friend 们,X509Certificate2X509Certificate2Collection .一切都很好,但我已经开始为我的代码编写测试,但遇到了问题。我生成一个新的测试证书并安装它以开始每个测试,然后在最后删除测试证书。尽管创建日期在过去一天和到期日期在未来一天,但测试证书不确定地无效。

我注意到在 TearDown 中运行完整的 GC 并等待终结器可以修复测试。

我一直在深入研究这里的引用源。似乎X509Certificate2需要处理,否则已经返回成功的操作(如添加到商店)可能尚未刷新到实际商店(这是 Windows API 的行为,请参阅 CertCloseStore CRYPT_E_PENDING_CLOSE 结果)。

进一步看来 X509Certificate2Collection基本上只是一个 List<X509Certificate2> ,因此每次创建这样的证书列表时,都需要处理每个实例,例如读取 Certificates商店的属性(property)。

此外,当 Find使用方法,这涉及创建一个临时存储、添加证书,然后从非托管代码中再次读回证书,创建一个新的证书集合,所有这些证书都需要处理。

这真的是使用 X509Store 的正确方法吗? ?似乎令人难以置信的是,.NET API 如此不安全且难以正确使用,到处都是静默故障和完全未记录的故障模式。我只是遗漏了一些明显的东西,还是应该避免所有这些类(class)?

最佳答案

有哪些未记录的故障模式?你应该处理你拥有的每一个一次性元素。这尤其适用于当您知道您正在处理 native 代码时。这与证书接口(interface)无关——文件以相同方式工作,数据库事务以相同方式工作,套接字以相同方式工作。这就是 IDisposable 接口(interface)首先存在的原因 - 它是通用接口(interface),表示“完成后给我打电话”。当您意识到需要关闭文件时,您是否停止使用文件 I/O?或者您还没有注意到它是必需的吗?

处理 SChannel 的整个加密模块只不过是 SChannel 之上的薄包装。也就是说,您所做的几乎每一件事都是 native 互操作、 native 对象上的托管包装器等。

但具体问题是什么并不重要。关键点仍然是您应该始终处理一次性用品。仅仅因为事情似乎有点工作,即使你不这样做并不意味着省略处置对象是好的。

关于c# - 如何正确使用X509Store?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39511623/

相关文章:

c# - Socket编程设计题

c# - 静态终结器

c# - Amazon EC2 开发堆栈

c# - 如何在 .NET 中动态调用类的方法?

c# - 是否有任何 C# 库包装 Xmpp Jingle 或包装用另一种语言编写的 Xmpp Jingle 库

c# - TypeDescriptor 属性检索不一致

c# - 如何从 Excel 单元格显示值读取而不用 ClosedXML 计算公式

c# - 为什么更新结构数组比更新类数组更快?

c# - 如何在 Windows Phone 上修改按钮以支持多点触控?

c# - 尝试统一使用 C# 从文本文件生成迷宫