首页 > 解决方案 > 我如何在“企业信任”商店中写作?

问题描述

我有一个带有一些证书的 .p7b 文件,我想将它们安装在“企业信任”商店中。我想使用的程序期望它在那里。

我在 c# 中编写了代码,它从文件中提取所有证书并将它们安装到一个有效的 X509Store(“Storename.My”)中。

如果我尝试使用相同的代码在不同的存储中写入它(已经存在),它会创建一个新的空存储并在那里写入。

StoreName.My 取自 system.Security.Cryptography.X509Certificates 公共枚举 StoreName,但没有“企业信任”存储选项。所以我尝试使用可以将 StoreName 作为字符串提供的构造函数。

我使用 Windows 中的 certmgr 来检查哪些证书存储在哪些商店中。

// open file
var certificateStore = new CmsSignedData(new 
FileStream(_tempFileName.ToString(), FileMode.Open));

// get all certificats
IX509Store x509Certs = certificateStore.GetCertificates("Collection");
var a = new ArrayList(x509Certs.GetMatches(null));

// this works
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser); 

// this doesnt work
// var store = new X509Store("Enterprise Trust", StoreLocation.CurrentUser);

// open store
store.Open(OpenFlags.ReadWrite);

// write in store
foreach (object o in a) {
    var cert = (Org.BouncyCastle.X509.X509Certificate)o;
    var cert509 = new X509Certificate2();
    cert509.Import(cert.GetEncoded());
    store.Add(cert509);
}
store.Close();

如何在不是 StoreName 枚举的商店中正确写入?

标签: c#.netbouncycastlex509certificatex509certificate2

解决方案


如果您想确保没有创建新商店,可以使用 OpenFlags 值OpenExistingOnly。断言该标志并检查例如"Trust2"产量因此我们通过将其指定为正确答案来System.Security.Cryptography.CryptographicException: The system cannot find the file specified. 获得最佳保证水平:"Trust"

using (X509Store store = new X509Store("Trust", StoreLocation.CurrentUser))
{
    store.Open(OpenFlags.ReadWrite | OpenFlags.OpenExistingOnly);
    ...
}

(请注意,这不太适合在 Linux (.NET Core) 上使用,因为只有 Windows 会预初始化存储)

我们可以通过certutil.exe命令行实用程序确认显示名称的程序名称:

>certutil -store trust
trust "Enterprise Trust"
CertUtil: -store command completed successfully.

(我只是在那家商店没有任何东西)


推荐阅读