Сообщение Как определить доступность закрытого ключа к сертификату по от 19.02.2021 7:51
Изменено 31.01.2023 8:00 Разраб
Как определить доступность закрытого ключа к сертификату по номеру
В деталях, есть номер сертификата криптопро, нужно понять доступен ли к нему ключ.
Самый простой способ. из умозрительного — попробовать создать подпись или еще что-нибудь, но может можно просто чекнуть есть/нет?
Самый простой способ. из умозрительного — попробовать создать подпись или еще что-нибудь, но может можно просто чекнуть есть/нет?
Как определить доступность закрытого ключа к сертификату по
В деталях, есть номер сертификата криптопро, нужно понять доступен ли к нему ключ.
Самый простой способ. из умозрительного — попробовать создать подпись или еще что-нибудь, но может можно просто чекнуть есть/нет?
SOLUTION: Чтобы определить доступность закрытого ключа в .net нужно 1) установить крипто про .net 2) .net должен быть определенной версии (по информации с форума), точно ниже 4.8(не работает)
В итоге решение такое(крипто про 5). получаем список доступных контейнеров и экспортируем из них сертификаты. по серику определяем доступен ли контейнер ЗК нужного серта.
Самый простой способ. из умозрительного — попробовать создать подпись или еще что-нибудь, но может можно просто чекнуть есть/нет?
SOLUTION: Чтобы определить доступность закрытого ключа в .net нужно 1) установить крипто про .net 2) .net должен быть определенной версии (по информации с форума), точно ниже 4.8(не работает)
В итоге решение такое(крипто про 5). получаем список доступных контейнеров и экспортируем из них сертификаты. по серику определяем доступен ли контейнер ЗК нужного серта.
var cp_root = @"C:\Program Files\Crypto Pro\CSP";
if (!TryExecute(Path.Combine(cp_root, "csptest.exe"), "-keyset -enum_cont -verifycontext -fqcn -machinekeys", handleError, out var output))
{
handleLog?.Invoke("csptest failed.");
return false;
}
var containers = output.Where(x => x.StartsWith(@"\\.\"));
foreach (var container in containers)
{
handleLog?.Invoke($"found container = {container}");
var cert_path = Path.GetTempFileName();
for_delete.Add(cert_path);
if (!TryExecute(Path.Combine(cp_root, "certmgr.exe"), $"-export -container \"{container}\" -certificate -dest \"{cert_path}\" -silent", handleError, out _))
{
handleLog?.Invoke($"container = \"{container}\" to \"{cert_path}\" failed.");
continue;
}
X509Certificate2 certToFind = new X509Certificate2();
certToFind.Import(File.ReadAllBytes(cert_path));