Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何正确使用X509Store?_C# - Fatal编程技术网

C# 如何正确使用X509Store?

C# 如何正确使用X509Store?,c#,C#,我一直在使用X509Store和他的朋友,X509Certificate2和X509Certificate2Collection。一切都很好,但我已经开始为我的代码编写测试,我遇到了一个问题。我生成一个新的测试证书并安装它以开始每个测试,然后在最后删除测试证书。尽管测试证书的创建日期为过去的一天,到期日期为未来的一天,但测试证书在非决定性方面无效 我注意到运行一个完整的GC并在拆卸中等待终结器可以修复测试 我一直在挖掘参考资料。似乎需要处理X509Certificate2,否则已返回成功的操作(

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

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

我一直在挖掘参考资料。似乎需要处理
X509Certificate2
,否则已返回成功的操作(如添加到存储)可能尚未刷新到实际存储(这是Windows API的行为,请参阅
CertCloseStore
CRYPT\u E\u PENDING\u CLOSE
结果)

进一步看来,
X509Certificate2Collection
基本上只是一个
列表
,因此每次创建这样的证书列表时,都需要处理每个实例,例如读取存储上的
Certificates
属性

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


这真的是使用
X509Store
的正确方法吗?令人难以置信的是,.NETAPI将是如此的不安全,并且在无声故障和完全没有记录的故障模式下难以正确使用。我只是缺少了一些明显的东西,还是应该避免这些类?

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

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


但确切的问题是什么并不重要。关键的一点仍然是,你应该总是处理一次性物品。即使您不这样做,事情似乎也能正常工作,但这并不意味着可以忽略处理对象。

从.NET Framework 4.6开始,这种类型实现IDisposable接口。当您使用完该类型后,您应该直接或间接地处理它。
。您不能使用
吗?是的,但我不拥有它们。我刚看到商店里有一处房产。这并不意味着我突然拥有了商店里所有证书的副本。而“查找”方法绝对不意味着我突然拥有了另一份。界面丝毫没有表明我应该拥有这些东西,甚至没有表明任何资源是被创建的。更不用说在.NET4.6之前应该如何使用它了。或者,任何一种检查可怕的“随机成功的操作没有发生”之类的事情。收藏本身甚至不是一次性的。好吧,你需要阅读文档。存储应该关闭(
您应该始终在使用后关闭X.509证书存储。
从.NET 2.0文档开始一直关闭),并且
关闭
方法从一开始就存在。当然,最初没有将
IDisposable
包含在商店中是一种疏忽。但我仍然觉得有趣的是,在我提到的每一个场景中,你都没有考虑过可怕的“随机成功的操作”(还有很多我没提过的)。NET仅为托管对象提供担保;X509存储区未被管理。在所有其他情况下,正确性并不取决于处理您从未打算创建的其他对象,也没有人说过创建了这些对象。@但您永远不必这样做。这就是
Close
(现在是
Dispose
)所做的。或者您是想说证书存储上的
Close
没有帮助?