我一直在使用X509Store
和他的朋友,X509Certificate2
和X509Certificate2Collection
。一切都很好,但我已经开始为我的代码编写测试,而且我遇到了问题。我生成一个新的测试证书并安装它以开始每个测试,然后在最后删除测试证书。尽管测试证书过去一天的创建日期和未来一天的到期日期,但测试证书是非确定性无效的。
我注意到在TearDown中运行完整的GC并等待终结器会修复测试。
我一直在挖掘参考资料。似乎需要处理X509Certificate2
,否则已经返回成功的操作(如添加到商店)可能尚未刷新到实际存储(这是Windows API的行为,请参阅{{1} } CertCloseStore
结果)。
似乎CRYPT_E_PENDING_CLOSE
基本上只是X509Certificate2Collection
,因此每次创建这样的证书列表时,都需要处理每个实例,例如阅读List<X509Certificate2>
商店里的财产。
此外,当使用Certificates
方法时,这涉及创建临时存储,添加证书,然后从非托管代码中再次读取证书,创建一个新的证书集合,也都需要处理。
这真的是使用Find
的正确方法吗?似乎令人难以置信的是,.NET API会如此极不安全,并且难以正确使用无声故障以及无处不在的无故障故障模式。我只是遗漏了一些明显的东西,还是应该避免这些类?
答案 0 :(得分:1)
什么无证失效模式?你应该处置你拥有的每一个一次性物品。这尤其适用于知道您正在处理本机代码的情况。这与证书接口无关 - 文件的工作方式相同,数据库事务的工作方式相同,套接字的工作方式相同。这就是为什么IDisposable
接口首先存在的原因 - 这是常见的界面,说“当你完成时给我打电话”。当您意识到需要关闭文件时,您是否停止使用文件I / O?或者你没有注意到它是必需的吗?
处理SChannel的整个加密模块只不过是SChannel上的一个瘦包装器。也就是说,你做的几乎每件事都是本机互操作,托管本机对象等等。
但问题究竟是什么并不重要。关键是你应该永远处理一次性用品。只是因为事情似乎有点工作,即使你不这样做也不意味着省略处理对象是可以的。