2009-05-22 4 views
16

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

Я обнаружил сертификат по следующему адресу: 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. Метод не переопределяется и имеет только один аргумент: путь.

Когда я проверить Exception, я нахожу это:

_COMPlusExceptionCode = -532459699 
Source=mscorlib 

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

ответ

25

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

Урока ...

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

Ваша информация спасла меня – user217648

+0

@ p.campell можно загрузить сертификат .pfx из локального каталога и получить отпечаток этого сертификата? – drgmak

6

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

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

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

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

    C: \ Program Files \ Windows Resource Kits \ Tools> winhttpcertcfg -i (Путь к файлу pfx, например e: \ Certs \ Foo.PFX) -с LOCAL_MACHINE \ My -a IIS_WPG -p (пароль для PFX-файла)

  • выплевывает ключевую информацию и предоставляет привилегии

    Предоставление закрытого ключа доступа к учетной записи:

    (SERVERNAME)\IIS_WPG 
    

Скачать WinHttpCertCfg.msihere, который устанавливает exe.

Подробнее о том, как использовать конфигурацию cert, можно найти here.

Затем он просто возвращается к тому, как вы делаете свой сертификат.

//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); 

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

5

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

6

Возможно, вам понадобится 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

2

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

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

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

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

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

_certificate.Import(certificatePath, "mypasswordusedtocreatethecertificate", X509KeyStorageFlags.MachineKeySet); 
0

Вам может понадобиться X509KeyStorageFlags.MachineKeySet.

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

Смежные вопросы