Коллеги из КриптоПро, подскажите куда конкретно в linux (ubuntu 20.04) устанавливается сертификат, импортированный в систему из pfx-файла штатной утилитой Инструменты КриптоПро (cptools) и как его получить в .net core под linux?
Подробнее:
В ubuntu 20.04 установлен КриптоПро CSP 5.0 R2 по инструкции отсюда (https://support.cryptopro.ru/index.php?/Knowledgebase/Article/View/390/0/rbot-s-kriptopro-csp-v-linux-n-primere-debian-11).
В системе также стоят .net core 3.1 (sdk и runtime), как этого требует ваше тестовое приложение (https://github.com/CryptoPro/DotnetCoreSampleProject/blob/master/docs/Linux.md).
В систему также импортирован сертификат штатной утилитой Инструменты КриптоПро (Вкладка Сертификаты -> Импортировать ключи -> Указан pfx-файл и задан пароль). Сертификат отображается в "Личное", а на вкладке Контейнеры сказано, что считывателем является HDIMAGE. Тестирование контейнер проходит.
В вашем тестовом приложении DotnetCoreSampleProject сертификат для теста добавлен прямо в код в виде массива байтов. Далее он у вас загружается в in-memory store:
Код:
var gostCert = new X509Certificate2(Gost2012_256Pfx, "1", X509KeyStorageFlags.CspNoPersistKeySet)
Нам такой вариант создания сертификата не подходит. Мы бы хотели его получать из хранилища, как это делалось в Windows. В windows этот код упрощенно выглядит примерно так:
Код:
public static X509Certificate2 GetCertificate(Credentials credentials)
{
var storeNameTag = (StoreName)Enum.Parse(typeof(StoreName), credentials.CertificateStoreName);
var storeLocationTag = (StoreLocation)Enum.Parse(typeof(StoreLocation), credentials.CertificateStoreLocation);
var certificateStore = new X509Store(storeNameTag, storeLocationTag);
certificateStore.Open(OpenFlags.ReadOnly);
var findByTag = (X509FindType)Enum.Parse(typeof(X509FindType), "FindByThumbprint");
var certificateCollection = certificateStore.Certificates.Find(findByTag, credentials.CertificateThumbprint, false);
return certificateCollection.Count != 0 ? certificateCollection[0] : null;
}
В ubuntu же с какими бы мы параметрами не открывали хранилище X509Store, оно ни в одном из вариантов не содержит нужного нам сертификата, добавленного штатной утилитой Инструменты КриптоПро, всегда хранилище не содержит ни одного сертификата. Подскажите пожалуйста как его можно получить из кода?
В ходе экспериментов мы выявили следующую интересную особенность:
Если хотя бы 1 раз в коде выполнить вот такую строчку:
Код:
var cert = new X509Certificate2(File.ReadAllBytes("test.pfx"), "SomePassword");
то выскакивает окошко КриптоПро, в котором требуется задать новый пароль для контейнера, после чего открытие хранилища без параметров, как показано ниже, начинает видеть и возвращать нужный сертификат:
Код:
var store = new X509Store();
store.Open(OpenFlags.ReadOnly);
С найденным сертификатом все хорошо, с его помощью можно выполнять подпись, все работает, но на поверку оказалось, что это другой сертификат (точнее его копия, но отпечаток другой). В итоге получается, что по сути один и тот же сертификат у нас в двух хранилищах: один сертификат КриптоПро куда-то запрятал и доступ к нему из кода мы получить не можем, а второй по всей видимости добавляется куда-то в хранилище .net и из кода виден. Нам бы все же хотелось добавлять сертификат штатной утилитой Инструменты КриптоПро и иметь доступ к нему из кода. Просим подсказать с примером кода как это можно осуществить.