X509Certificate.CreateFromCertFile - указанный сетевой пароль неверен
У меня есть приложение .NET, которое я хочу использовать в качестве клиента для вызова веб-службы SSL SOAP. Я получил сертификат действительного клиента под названием foo.pfx
. В самом сертификате есть пароль.
Я нашел сертификат в следующем месте: C:\certs\foo.pfx
Чтобы вызвать веб-службу, мне нужно прикрепить клиентский сертификат. Здесь код:
public X509Certificate GetCertificateFromDisk(){
try{
string certPath = ConfigurationManager.AppSettings["MyCertPath"].ToString();
//this evaluates to "c:\\certs\\foo.pfx". So far so good.
X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath);
// exception is raised here! "The specified network password is not correct"
return cert;
}
catch (Exception ex){
throw;
}
}
Похоже, что исключение распространяется на приложение .NET, пытающееся прочитать диск. Метод CreateFromCertFile
является статическим методом, который должен создать новый экземпляр X509Certificate. Метод не переопределяется и имеет только один аргумент: путь.
Когда я проверяю Исключение, я нахожу это:
_COMPlusExceptionCode = -532459699
Source=mscorlib
Вопрос: кто-нибудь знает, в чем причина исключения? Указанный сетевой пароль неверен?
Ответы
Ответ 1
Оказывается, я пытался создать сертификат из .pfx вместо файла .cer.
Извлеченный урок...
- .cer файлы - это сертификат X.509 в двоичной форме. Они DER закодированы.
- .pfx файлы файлы контейнера. Также кодируется DER. Они содержат не только сертификаты, но и закрытые ключи в зашифрованном виде.
Ответ 2
В зависимости от вашей ситуации вам, вероятно, необходимо сначала установить сертификат на сервере, чтобы получить уровень доверия до экспорта файла .cer
.
Я должен был сделать это для подобного проекта, и здесь были мои заметки о том, как это было сделано.
Замените Foo.cer
на экспорт сертификата, установленного на сервере. (Установите сертификат из файла pfx
, а затем экспортируйте его в файл cer
.)
-
Команда для IIS6 позволяет группе IIS_WPG получить доступ к сертификату. Необходимо установить winhttpcertcfg
(вы можете перейти по ссылке ниже, чтобы получить собственную копию).
C:\Program Files\Windows Resource Kits\Tools > winhttpcertcfg -i (путь к файлу pfx, например e:\Certs\Foo.pfx) -c LOCAL_MACHINE\My -a IIS_WPG -p (Пароль для файла pfx )
-
Выделяет информацию о ключах и предоставляет привилегии
Предоставление доступа к секретному ключу для учетной записи:
(SERVERNAME)\IIS_WPG
Загрузите WinHttpCertCfg.msi
здесь, который устанавливает exe.
Подробнее о том, как использовать конфигурацию cert, можно найти здесь.
Затем он просто вернется к тому, как вы делаете свой сертификат.
//Cert Challenge URL
Uri requestURI = new Uri("https://someurl");
//Create the Request Object
HttpWebRequest pageRequest = (HttpWebRequest)WebRequest.Create(requestURI);
//After installing the cert on the server export a client cert to the working directory as Foo.cer
string certFile = MapPath("Foo.cer");
X509Certificate cert = X509Certificate.CreateFromCertFile(certFile);
//Set the Request Object parameters
pageRequest.ContentType = "application/x-www-form-urlencoded";
pageRequest.Method = "POST";
pageRequest.AllowWriteStreamBuffering = false;
pageRequest.AllowAutoRedirect = false;
pageRequest.ClientCertificates.Add(cert);
Это, как я передал сертификат, но не уверен, что именно вам нужно делать с вашим сертификатом, так что это может быть не то же самое для вас.
Ответ 3
Возможно, вам понадобится пользователь X509Certificate2()
с параметром X509KeyStorageFlags.MachineKeySet
. Это фиксировало аналогичную проблему. Приобретите оригинальный сайт, который предложил следующее: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production/
Цитирование:
Причина
Причина проблемы, похоже, не имеет большого отношения к Сообщения об ошибках. По какой-то причине конструктор пытается получить доступ к хранилищу закрытого ключа, хотя закрытый ключ хранится в открывшемся файле. По умолчанию используется хранилище ключей пользователя, но ASP.NET(и, возможно, неинтерактивные службы Windows в целом) не разрешено открывать его. Скорее всего, это хранилище ключей пользователя для выбранная учетная запись даже не существует.
Решение
Одна вещь, которую вы могли бы попробовать - создать хранилище пользовательских ключей, войдя в учетной записи и импортировать сертификат в свой Личный магазин (и затем удалите его снова).
Другое решение - передать дополнительный параметр конструктору - флаг, указывающий, что закрытые ключи (предположительно) хранятся в локальный компьютер - X509KeyStorageFlags.MachineKeySet, например: var
certificate = new X509Certificate2(fileName, password,
X509KeyStorageFlags.MachineKeySet);
Для PFX без пароля, пароль можно указать как string.Empty
.
См. также fooobar.com/questions/315975/...
Ответ 4
Сообщение об ошибке "указанный сетевой пароль неверно" также возвращается, когда сертификат, который вы пытаетесь импортировать в одном из хранилищ ОС, уже присутствует в этом хранилище.
Ответ 5
В моем случае я пытался запустить в режиме Private Application, и я получил ту же ошибку.
Указанный сетевой пароль неверен
Конструктор PrivateAuthenticator (в Xero.Api.Example.Applications.Private
) пытался импортировать сертификат, предполагая, что при создании сертификата не было пароля.
_certificate = new X509Certificate2();
_certificate.Import(certificatePath);
Затем я изменил импорт, чтобы использовать метод перегрузки, который использует пароль,
_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet);
Ответ 6
Возможно, вам понадобится X509KeyStorageFlags.MachineKeySet.
Я использую сертификат из веб-задания.