Windows Sertifika Deposuna özel anahtarlı bir sertifika almaya çalışıyorum. Sertifikayı aşağıdakileri kullanarak başarıyla içe aktarabilirim
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);
Ancak sahip olduğum sorun, bir kullanıcının özel anahtara programlı olarak nasıl erişebileceğidir.
Bu bağlantıları yararlı buldum:
https://www.pkisolutions.com/accessing-and-using-certificate-private-keys-in-net-framework-net-core/
CngKey Makine anahtarına izin atama
. NET 5'te Sertifika PrivateKey İzinlerini Ayarlama
Certlm ile kullanıcı arayüzü üzerinden erişim izni verebilirim.msc > Sertifikayı Kişisel depo'ya sürükleyin > > Sertifikaya sağ tıklayın > > > Tüm Görevler > > > > Özel anahtarları yönet > > > > > Kullanıcı ve izni ekle
Ama bunu programlı olarak yapmam gerekiyor
Örneklerin geldiği yer olan. NET Full Framework'ten değişiklikler var. Üzerinde bir günden fazla zaman harcadım, birden fazla sertifika denedim, sertifika kesinlikle dışa aktarılabilir olarak işaretlendi ve yönetici olarak çalışıyor. Yalnızca Windows çözümünden memnunum
Bu var olduğu yer
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'yi görebiliyorum.Anahtar hata ayıklamada bulunur, ancak bir sonraki satırda başarısız olur (kesinlikle dışa aktarılabilir)
Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: 'Key not valid for use in specified state.'
Ayrıca, acl'yi doğrudan dosyada ayarlamayı denememeniz gerektiğine dair yorumları okudum, ancak bunun doğru olup olmadığından emin değilim