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

StackOverflow https://stackoverflow.com/questions/899991

Вопрос

У меня есть .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;
     }
}

Похоже, что исключение связано с .СЕТЕВОЕ приложение пытается прочитать диск.Метод CreateFromCertFile это статический метод, который должен создать новый экземпляр X509Certificate.Метод не переопределяется и имеет только один аргумент:путь.

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

_COMPlusExceptionCode = -532459699
Source=mscorlib

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

Это было полезно?

Решение

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

Урок усвоен...

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

Другие советы

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

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

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

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

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

    C:\Program Файлы\Наборы ресурсов Windows\Инструменты>winhttpcertcfg -i (Путь к файлу pfx, например.e:\Certs\Foo.pfx ) -c LOCAL_MACHINE\My -a IIS_WPG -p (пароль для файла pfx)

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

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

    (SERVERNAME)\IIS_WPG
    

Скачать WinHttpCertCfg.msi здесь это устанавливает exe-файл.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top