X509Certificate.CreateFromCertFile - указанный сетевой пароль неверен - PullRequest
22 голосов
/ 23 мая 2009

У меня есть приложение .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 - это статический метод, который должен создать новый экземпляр сертификата X509. Метод не переопределяется и имеет только один аргумент: путь.

Когда я проверяю Исключение, я нахожу это:

_COMPlusExceptionCode = -532459699
Source=mscorlib

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

Ответы [ 7 ]

30 голосов
/ 23 мая 2009

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

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

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

Возможно, вам потребуется 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.

См. Также https://stackoverflow.com/a/8291956/130352

7 голосов
/ 23 мая 2009

В зависимости от вашей ситуации вам, вероятно, потребуется сначала установить сертификат на сервере, чтобы повысить уровень доверия, прежде чем экспортировать файл .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 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);

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

6 голосов
/ 12 мая 2010

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

3 голосов
/ 29 сентября 2015

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

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

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

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

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

_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate",  X509KeyStorageFlags.MachineKeySet);
1 голос
/ 30 мая 2017

Возможно, вам потребуется X509KeyStorageFlags.MachineKeySet.

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

0 голосов
/ 06 сентября 2018

В моем случае изменение удостоверения на NetworkService в пуле приложений решило эту проблему.

...