Pergunta

Eu tenho um aplicativo .NET que eu quero usar como um cliente para chamar um serviço web SSL SOAP. I foram fornecidos com um certificado de cliente válido chamado foo.pfx. Há uma senha no próprio certificado.

Eu localizei o certificado no seguinte local: C:\certs\foo.pfx

Para chamar o serviço web, eu preciso anexar o certificado de cliente. Aqui está o código:

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;
     }
}

Parece que a exceção é em torno do aplicativo .NET tentar ler o disco. O método CreateFromCertFile é um método estático que deve criar uma nova instância de X509Certificate. O método não é substituído, e tem apenas um argumento:. O caminho

Quando eu inspecionar a exceção, eu acho o seguinte:

_COMPlusExceptionCode = -532459699
Source=mscorlib

Pergunta: Alguém sabe qual é a causa da exceção "A senha de rede especificado não está correto"

Foi útil?

Solução

Acontece que eu estava tentando criar um certificado do .pfx em vez do arquivo .cer.

Lição aprendida ...

  • arquivos .cer são um certificado X.509 na forma binária. Eles são DER codificado .
  • arquivos .pfx são arquivos recipiente . Também codificado por DER. Eles contêm não apenas os certificados, mas também chaves privadas de forma criptografada.

Outras dicas

Você pode precisar X509Certificate2() usuário com um parâmetro de X509KeyStorageFlags.MachineKeySet vez. Este fixa um problema semelhante que tínhamos. Crédito para o site original que sugeriu este: http://vdachev.net/2012/03/07/c-sharp-error-creating-x509certificate2-from-a-pfx-or-p12-file-in-production /

Citando:

Causa

A causa do problema não parece ter muito a ver com o mensagens de erro. Por alguma razão o construtor está a tentar obter o acesso ao armazenamento de chaves privadas, embora a chave privada é armazenada em no arquivo que está sendo aberto. Por padrão, o armazenamento de chaves do usuário é usado, mas ASP.NET (e serviços do Windows provavelmente não interativos em geral) são não tem permissão para abri-lo. As possibilidades são o armazenamento de chaves do usuário para o conta selecionada não existe mesmo.

Solução

Uma coisa que você poderia tentar é criar um armazenamento de chaves do usuário, entrando em a conta e importar um certificado em seu arquivo pessoal (e em seguida, removê-lo de novo).

Outra solução é passar um parâmetro adicional para o construtor - uma bandeira que indica as chaves privadas são (supostamente) armazenados em o computador local - X509KeyStorageFlags.MachineKeySet, como este: var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);

Para um PFX sem senha, em seguida, a senha pode ser especificado como string.Empty.

Veja também https://stackoverflow.com/a/8291956/130352

Dependendo da sua situação, você provavelmente precisará instalar o certificado no servidor primeiro para obter o nível de confiança antes de exportar o arquivo .cer.

Eu tive que fazer isso para um projeto semelhante e aqui foram minhas anotações sobre como ele foi realizado.

Substitua o Foo.cer com uma exportação do certificado instalado no servidor. (Instale o certificado do arquivo pfx e, em seguida, exportá-lo para um arquivo cer.)

  • Comando para IIS6 para permitir IIS_WPG acesso do grupo para a chave cert. Necessidade de instalar winhttpcertcfg (Você pode seguir o link abaixo para agarrar sua própria cópia).

    C: \ Arquivos de programas \ Windows Resource Kits \ Tools> WinHttpCertCfg -i (Caminho para o arquivo pfx, por exemplo, e:. \ Certs \ Foo.pfx) -c LOCAL_MACHINE \ My -a IIS_WPG -p (senha para o arquivo pfx )

  • cospe informações e subsídios chave privilégio

    A concessão de acesso chave privada para a conta:

    (SERVERNAME)\IIS_WPG
    

Fazer download WinHttpCertCfg.msi aqui que instala o exe.

Mais informações sobre como utilizar a configuração do cert pode ser encontrada aqui .

Em seguida, ele só vai voltar a ser como você está fazendo o seu impulso 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);

Este como eu passou o certificado, mas não sabe exatamente o que você está precisando fazer com seu cert então isso pode não ser o mesmo para você.

A 'a senha de rede especificado não está correto' mensagem de erro também é devolvido quando o certificado que você está tentando importar em uma das lojas OS já está presente nessa loja.

No meu caso eu estava tentando executar no modo de Aplicação Privada e eu tenho o mesmo erro.

A senha de rede especificado não está correto

O construtor PrivateAuthenticator (em Xero.Api.Example.Applications.Private) estava tentando importar o certificado assumindo que não há senha definida durante a criação do certificado.

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

Então eu mudei a importação de usar um método de sobrecarga que utiliza a senha,

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

Você pode precisar X509KeyStorageFlags.MachineKeySet.

Eu estou usando o certificado de trabalho web.

No meu caso a mudança de identidade para NetworkService no pool de aplicativos resolveu este problema.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top