windows X509Chain.Build()似乎忽略LocalComputer/My中的证书

brccelvz  于 2023-03-09  发布在  Windows
关注(0)|答案(1)|浏览(128)

我需要根据结束证书重建证书链,然后导出链中的所有证书,为此我使用了X509Chain.Build(endCertificate)方法,我的想法是这样可以尽可能地找到所有证书(来自不同的来源,如文件夹(通过ChainPolicy.ExtraStore),但也可以从系统的所有证书存储区(如“我的”或“受信任的根证书颁发机构”))。如果证书丢失,我要求用户手动选择它(并且在下一次运行时它将被复制到一个ChainPolicy.ExtraStore文件夹中)。重复此操作直到所有证书已知并且链可以成功构建。
但是,我现在遇到了我在测试中注意到的问题,即无法构建链,因为据说缺少中间CA证书。但是,此证书位于“LocalComputer/My”中。如果证书位于“LocalComputer/Intermediate Certificate Authorities”中,则它可以工作。
因此,问题是:如何确保使用整个证书存储区(LocalUser和LocalComputer以及所有子存储区)搜索证书?

  • 系统:Windows 11 22 H2;. NET版本:网络6.0- windows *
ndh0cuux

ndh0cuux1#

默认情况下,证书验证不会查看证书存储(如My)中的受信任根。如果需要,可以向ExtraStore属性添加其他存储。
您还需要设置X509VerificationFlags.AllowUnknownCertificateAuthority,否则它仍将被拒绝。请注意,这可能会导致重大安全问题,具体取决于您的使用情况,并且您可能需要对信任链执行其他手动检查。

using var store1 = new X509Store(StoreName.My, StoreLocation.LocalMachine, OpenFlags.OpenExistingOnly);
chain.ChainPolicy.ExtraStore.AddRange(store1.Certificates);
chaim.VerificationFlags |= X509VerificationFlags.AllowUnknownCertificateAuthority;
chain.Build(someCert);

默认情况下使用StoreName.RootCertificateAuthorityTrustedPeopleAuthRootRoot的子集。使用Disallowed没有意义,这样就只剩下MyAddressBookTrustedPublisher要添加。这是针对StoreLocation.LocalMachineCurrentUser的。同样,CurrentUser的安全风险更大。
把所有的存储在一个using处理他们完成后。
理想情况下,您应该首先将中间证书和根证书存储在正确的位置。

相关问题