Я пытаюсь импортировать сертификат с закрытым ключом в хранилище сертификатов 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 непосредственно в файле, но не уверен, правильно это или нет