X509Certificate.CreateFromCertFile – указанный сетевой пароль неверен

Вопрос:У меня есть приложение .NET, которое я хочу использовать в качестве клиента для вызова веб-службы SSL SOAP. Я получил сертификат действительного клиента под названием foo.pfx. В самом сертификате есть пароль. Я нашел сертификат в следующем месте: C:certsfoo.pfx Чтобы вызвать веб-службу, мне нужно прикрепить клиентский сертификат. Здесь код: public X509Certificate GetCertificateFromDisk(){ try{ string certPath = ConfigurationManager.AppSettings["MyCertPath"].ToString();

Вопрос:

У меня есть приложение .NET, которое я хочу использовать в качестве клиента для вызова веб-службы SSL SOAP. Я получил сертификат действительного клиента под названием foo.pfx. В самом сертификате есть пароль.

Я нашел сертификат в следующем месте: C:certsfoo.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

Вопрос: кто-нибудь знает, в чем причина исключения? Указанный сетевой пароль неверен?

Лучший ответ:

Оказывается, я пытался создать сертификат из .pfx вместо файла .cer.

Извлеченный урок…

  • .cer файлы – это сертификат X.509 в двоичной форме. Они DER закодированы.
  • .pfx файлы файлы контейнера. Также кодируется DER. Они содержат не только сертификаты, но и закрытые ключи в зашифрованном виде.

Ответ №1

В зависимости от вашей ситуации вам, вероятно, необходимо сначала установить сертификат на сервере, чтобы получить уровень доверия до экспорта файла .cer.

Я должен был сделать это для подобного проекта, и здесь были мои заметки о том, как это было сделано.

Замените Foo.cer на экспорт сертификата, установленного на сервере. (Установите сертификат из файла pfx, а затем экспортируйте его в файл cer.)

  • Команда для IIS6 позволяет группе IIS_WPG получить доступ к сертификату. Необходимо установить winhttpcertcfg (вы можете перейти по ссылке ниже, чтобы получить собственную копию).

    C:Program FilesWindows Resource KitsTools > winhttpcertcfg -i (путь к файлу pfx, например e:CertsFoo.pfx) -c LOCAL_MACHINEMy -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);

Это, как я передал сертификат, но не уверен, что именно вам нужно делать с вашим сертификатом, так что это может быть не то же самое для вас.

Ответ №2

Возможно, вам понадобится пользователь X509Certificate2() с параметром X509KeyStorageFlags.MachineKeySet. Это фиксировало аналогичную проблему. Приобретите оригинальный сайт, который предложил следующее:

Цитирование:

Причина

Причина проблемы, похоже, не имеет большого отношения к Сообщения об ошибках. По какой-то причине конструктор пытается получить доступ к хранилищу закрытого ключа, хотя закрытый ключ хранится в открывшемся файле. По умолчанию используется хранилище ключей пользователя, но ASP.NET(и, возможно, неинтерактивные службы Windows в целом) не разрешено открывать его. Скорее всего, это хранилище ключей пользователя для выбранная учетная запись даже не существует.

Решение

Одна вещь, которую вы могли бы попробовать – создать хранилище пользовательских ключей, войдя в учетной записи и импортировать сертификат в свой Личный магазин (и затем удалите его снова).

Другое решение – передать дополнительный параметр конструктору – флаг, указывающий, что закрытые ключи (предположительно) хранятся в локальный компьютер – X509KeyStorageFlags.MachineKeySet, например: var
certificate = new X509Certificate2(fileName, password,
X509KeyStorageFlags.MachineKeySet);

Для PFX без пароля, пароль можно указать как string.Empty.

См. также qaru.site/questions/315975/…

Ответ №3

Сообщение об ошибке “указанный сетевой пароль неверно” также возвращается, когда сертификат, который вы пытаетесь импортировать в одном из хранилищ ОС, уже присутствует в этом хранилище.

Ответ №4

В моем случае я пытался запустить в режиме Private Application, и я получил ту же ошибку.

Указанный сетевой пароль неверен

Конструктор PrivateAuthenticator (в Xero.Api.Example.Applications.Private) пытался импортировать сертификат, предполагая, что при создании сертификата не было пароля.

_certificate = new X509Certificate2(); _certificate.Import(certificatePath);

Затем я изменил импорт, чтобы использовать метод перегрузки, который использует пароль,

_certificate.Import(certificatePath, «mypasswordusedtocreatethecertificate», X509KeyStorageFlags.MachineKeySet); Ответ №5

Возможно, вам понадобится X509KeyStorageFlags.MachineKeySet.

Я использую сертификат из веб-задания.

Оцените статью
Добавить комментарий