Проблема с установкой сертификата из файла .pfx

Я пытаюсь установить сертификат на свой локальный компьютер (Win Server 2003) с классом X509Certificate2 в тестовом консольном приложении С#. Когда я устанавливаю сертификат со следующим кодом, все в порядке:

var serviceRuntimeMachineCertificateStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
serviceRuntimeMachineCertificateStore.Open(OpenFlags.ReadWrite);
cert = new X509Certificate2(certificatePath);
serviceRuntimeMachineCertificateStore.Add(cert);
serviceRuntimeMachineCertificateStore.Close();

Проблема в том, что закрытый ключ сертификата не сохраняется при установке без X509KeyStorageFlags.PersistKeySet. Итак, я попытался создать экземпляр сертификата следующим образом (закрытый ключ не имеет пароля, поэтому я передаю пустую строку):

var serviceRuntimeMachineCertificateStore = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
serviceRuntimeMachineCertificateStore.Open(OpenFlags.ReadWrite);
cert = new X509Certificate2(certificatePath, "", X509KeyStorageFlags.PersistKeySet);
serviceRuntimeMachineCertificateStore.Add(cert);
serviceRuntimeMachineCertificateStore.Close();

Но при попытке создать экземпляр сертификата возникает исключение System.Security.Cryptography.CryptographicException «Не удалось загрузить сертификат: указанный сетевой пароль неверен», даже если закрытый ключ не имеет пароля.

Если я импортирую сертификат в консоль управления Microsoft без указания пароля, он отлично работает.

Кто-нибудь знает, как это сделать программно?


person Christopher    schedule 12.04.2011    source источник


Ответы (4)


Если вы попытаетесь создать экземпляр X509Certificate2 с пустым паролем в Windows XP или Windows 2003, появится сообщение «Не удалось загрузить сертификат: указанный сетевой пароль неверен». будет выброшено исключение.

Если можете, попробуйте создать сертификат с непустым паролем. Тогда все должно быть хорошо.

person uGeeen    schedule 27.02.2013
comment
Я столкнулся с той же проблемой в Windows XP SP3 и смог исправить ее, используя версию конструктора X509Certificate2, которая не требует пароля. - person NineBerry; 12.12.2013

Надеюсь, это кому-нибудь поможет (и расширит ответ uGeeen:

Пользователь "SC" указывает следующее требование для сертификата пароли в Windows XP и Windows Server 2003.

0 < password.Length < 32

Я видел противоречивые отчеты о том, разрешено ли 32. Я могу подтвердить, что использовал 32-символьный пароль (хэш MD5), и усечение его до 30 символов устранило проблему.

person Millie Smith    schedule 24.10.2014
comment
в Windows10 я могу ввести только 50 символов в пароль при экспорте в PFX - person stuzor; 01.11.2018

вы делаете это из рабочего процесса или какого-то другого олицетворенного процесса? это может быть просто то, что идентификатор, который использует ваш процесс, инициализируется БЕЗ загрузки профиля пользователя идентификатора, что, по-видимому, приводит к отсутствию доступа к хранилищу сертификатов пользователя.

у меня была аналогичная проблема при загрузке сертификата x509 с закрытыми ключами из процессов ASP.Net/IIS, и включение загрузки профиля для обработанного работника помогло

person quetzalcoatl    schedule 26.05.2012

На случай, если у кого-то возникнет аналогичная проблема: мне удалось установить сертификат и сохранить закрытый ключ другим способом. Я нашел инструмент командной строки WinHttpCertCfg, который вы можете получить здесь: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winhttp/http/winhttpcertcfg_exe__a_certificate_configuration_tool.asp

Затем я программно вызываю этот инструмент командной строки для установки сертификата. Этот сайт дал мне подсказку о том, как его использовать: weblogs.asp .net/hernandl/archive/2005/02/09/…

Привет, Крис

person Christopher    schedule 03.01.2013