Невозможно сохранить X509Certificate2 с его закрытым ключом в X509Store.C#

Место общения программистов C#
Ответить
Anonymous
 Невозможно сохранить X509Certificate2 с его закрытым ключом в X509Store.

Сообщение Anonymous »

Я пытаюсь держаться подальше от CERTENROLLLib, я пытался использовать ванильный .NET8 CertificateRequest для генерации CSR, получения обратно сертификата и повторной интеграции закрытого ключа. в сертификат перед сохранением его обратно в X509Store Windows внутри StoreName.My.
Код, который у меня есть, при его отладке показывает, что закрытый ключ возвращается в сертификат, но после его сохранения я не могу экспортировать сертификат с его закрытым ключом... его там практически нет. Есть ли способ заархивировать то, что я описал здесь?
public static readonly X509KeyStorageFlags InstallFlags = X509KeyStorageFlags.Exportable |
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.UserKeySet;

byte[] rawData = Convert.FromBase64String(x509Base64);
using (var tmp = new X509Certificate2(rawData, "", InstallFlags))
{
string pubKey = Convert.ToBase64String(tmp.PublicKey.EncodedKeyValue.RawData);

SomeTempCryptoDictionary.TryGetValue(pubKey, out var crypto);
using (var certWithPrivateKey = tmp.CopyWithPrivateKey((RSA) crypto))
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadWrite);
store.Add(certWithPrivateKey);
store.Close();

certWithPrivateKey.Reset();
}
}

Я не уверен, разрешено ли мне вводить туда пустой пароль, но он не жаловался и не выдавал никаких ошибок, я определенно не могу передать ноль. Такое ощущение, что я ДЕЙСТВИТЕЛЬНО близок к тому, чтобы заставить его работать без CERTENROLLLib, просто не знаю, чего еще мне не хватает...?
Это та часть, где был сгенерирован CSR используя CertificateRequest.
RSA rsa = RSA.Create(2048);
X500DistinguishedName dn = new X500DistinguishedName("CN=HelloWorld");
CertificateRequest csr = new CertificateRequest(dn, rsa,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);
string pubKey = Convert.ToBase64String(csr.PublicKey.EncodedKeyValue.RawData);
// saved to be use when it comes back
SomeTempCryptoDictionary.Add(pubKey, rsa);

return Convert.ToBase64String(csr.CreateSigningRequest());

Изменить: по предложению @bartonjs, результат тот же, даже при попытке экспорта/импорта как Pkcs12
using (var certWithPrivateKey = tmp.CopyWithPrivateKey((RSA) crypto))
using (var certExportable = new X509Certificate2(certWithPrivateKey.Export(X509ContentType.Pkcs12)))
using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser))


Подробнее здесь: https://stackoverflow.com/questions/782 ... -x509store
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»