Как я могу написать в магазине "Enterprise Trust"? - PullRequest
0 голосов
/ 07 января 2019

У меня есть файл .p7b с несколькими сертификатами, и я хочу установить их в магазине "Enterprise Trust". Программа, которую я хочу использовать, ожидает ее там.

У меня есть код для записи в c #, который извлекает все сертификаты из файла и устанавливает их в X509Store ("Storename.My"), который работает.

Если я пытаюсь использовать тот же код для записи в другое хранилище, оно (которое уже существует) создает новое пустое хранилище и записывает туда.

StoreName.My взято из system.Security.Cryptography.X509Certificates public enum StoreName, но для хранилища «Доверие предприятия» опция отсутствует. Поэтому я попытался использовать конструктор, в котором я могу указать StoreName в виде строки.

Я использую certmgr из windows, чтобы проверить, какие сертификаты хранятся в каких магазинах.

// 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?

1 Ответ

0 голосов
/ 08 января 2019

Если вы хотите быть уверены, что не создаете новый магазин, вы можете использовать значение 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.

(у меня просто ничего нет в этом магазине)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...