Разрешения на закрытый ключ сертификата в .NET 6

0

Вопрос

Я пытаюсь импортировать сертификат с закрытым ключом в хранилище сертификатов Windows. Я могу успешно импортировать сертификат, используя приведенное ниже

X509Certificate2 certificate = new(certByteArray, certPassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
X509Store store = new(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadWrite);
store.Add(certificate);

Но проблема, с которой я столкнулся, заключается в том, как предоставить пользователю доступ к закрытому ключу программно.
Я нашел эти ссылки полезными:
https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/
CngKey Назначает разрешение на машинный ключ

Установите права доступа к сертификату PrivateKey в .NET 5

Я могу предоставить доступ через пользовательский интерфейс с помощью certlm.msc > Перетащите сертификат в Личное хранилище >> Щелкните правой кнопкой мыши сертификат >>> Все задачи >>>> Управление закрытыми ключами >>>>> Добавьте пользователя и разрешение
Но мне нужно сделать это программно

Существуют изменения в .NET Full Framework, из которых взяты примеры. Я потратил на это больше дня, перепробовал несколько сертификатов, сертификат определенно помечен как экспортируемый и работает от имени администратора. Я доволен решением только для Windows

Это самое близкое, что у меня есть

const string NCRYPT_SECURITY_DESCR_PROPERTY = "Security Descr";
const CngPropertyOptions DACL_SECURITY_INFORMATION = (CngPropertyOptions)4;

X509Store trustedPeopleStore = new(StoreName.TrustedPeople, StoreLocation.LocalMachine);
trustedPeopleStore.Open(OpenFlags.ReadWrite);

var certificates = trustedPeopleStore.Certificates.Find(X509FindType.FindByThumbprint, "xxxxxxxxxxxxxxxxxxxxxx", false);

RSA rsa = certificates[0].GetRSAPrivateKey();
RSACng rsaCng = rsa as RSACng;

CngProperty prop = rsaCng.Key.GetProperty(NCRYPT_SECURITY_DESCR_PROPERTY, DACL_SECURITY_INFORMATION);

Я вижу RSACng.Ключ присутствует в отладке, но он выходит из строя в следующей строке (он определенно может быть экспортирован), получая свойство с Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state.' Я также читал комментарии о том, что вам не следует пытаться устанавливать acl непосредственно в файле, но не уверен, правильно это или нет

.net acl c# cng
2021-11-24 00:59:41
1

Лучший ответ

0

См. Этот пост проекта кода для некоторых примеров кода, который предоставляет доступ программно (в частности, посмотрите на метод "AddAccessToCertificate").

Проверьте это для получения дополнительной информации: Программное добавление сертификата в личное хранилище

2021-12-02 16:48:54

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................