Закрытый ключ не загружается при загрузке из хранилища сертификатов

Аутентификация в RavenDB 4 должна происходить с помощью сертификатов, которые я создал с помощью Let's Encrypt. Мой сертификат закрытого ключа (.pfx) хранится в Azure Key Vault. Поскольку можно загружать только сертификаты, защищенные паролем, я сделал это безопасным с помощью пароля.

При загрузке сертификата с использованием отпечатка сертификата он всегда показывает, что у него нет закрытого ключа, что приводит к сбою процесса аутентификации в моем экземпляре RavenDB. Как локально через хранилище сертификатов Windows, так и в Azure.

Я уже пытался работать с сертификатом закрытого ключа без пароля, после чего мне удалось получить закрытый ключ. Тем не менее, это не решение, поскольку я не могу загрузить его в Azure.

var certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
certStore.Open(OpenFlags.ReadOnly);
X509Certificate2 targetClientCertificate;
var certCollection = certStore.Certificates.Find(X509FindType.FindByThumbprint, ravenDbSettings["CertificateThumbPrint"], false);
targetClientCertificate = new X509Certificate2(certCollection[0].GetRawCertData(), ravenDbSettings["CertificatePassword"], X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); ;

Я также попробовал это с помощью экспорта, который я где-то нашел

var targetTwo = new X509Certificate2(certCollection[0].Export(X509ContentType.Pfx, ravenDbSettings["CertificatePassword"]));

Но потом я получил

Internal.Cryptography.CryptoThrowHelper.WindowsCryptographicException: «Ключ недействителен для использования в указанном состоянии»

Моя цель — загрузить закрытый ключ сертификата и, таким образом, пройти аутентификацию в RavenDB.


person Echarnus    schedule 27.06.2019    source источник
comment
Вы пробовали targetClientCertificate = certCollection[0];?   -  person bartonjs    schedule 27.06.2019


Ответы (2)


Вы должны использовать существующий сертификат, хранящийся в переменной certCollection. Последняя строка (где вы заполняете переменную targetClientCertificate) не нужна и не будет работать, если закрытый ключ не экспортируется. Если для кода требуется существующий экземпляр класса X509Certificate2, он сохраняется в certCollection и будет иметь связанную ссылку с закрытым ключом.

person Crypt32    schedule 27.06.2019
comment
Не знал о такой "безопасности". Потребовалось некоторое время, чтобы полностью проверить это. Но это работает. Спасибо! - person Echarnus; 09.07.2019

Вероятно, это связано с тем, как вы создаете свой сертификат. Попробуй это:

Загрузите openssl: http://gnuwin32.sourceforge.net/packages/openssl.htm

Создать сертификат и закрытый ключ: openssl req -new -newkey rsa:1024 -days 365 -nodes -x509 -keyout YourName.key -out YourName.cert

Создать файл pfx: openssl pkcs12 -export -inkey YourName.key -in YourName.cert -out YourName.pfx

Импорт YourName.pfx в магазин

person crankedrelic    schedule 27.06.2019
comment
ОП спрашивает о существующем сертификате, он не спрашивал о создании нового сертификата. - person Crypt32; 27.06.2019