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