X509Certificate – o conjunto de chaves não existe

Eu tenho um aplicativo WinForms que consome um WCF e passar como um parâmetro para uma function de um certificado:

mySvcClient.SendDocument(cert.Export(X509ContentType.SerializedCert, "password")); ... 

No serviço WCF , recriou o certificado da matriz de bytes:

 public void SendDocument (byte[] binaryCert) { X509Certificate2 cert = new X509Certificate2(binaryCert, "password"); ... 

Mas ao usar o certificado para assinar um xml, recebi o erro “O Keyset não existe”:

 if (cert.HasPrivateKey) // WORKS!!! { signedXml.SigningKey = cert.PrivateKey; // THROW "keyset does not exist" EXCEPTION ... 

No meu computador, o aplicativo funciona 100%! Mas no WebServer, recebi esse erro!

A questão é: mesmo X509Certificate2 recriado a partir de uma matriz de bytes, eu preciso de alguma permissão especial para acessar a chave privada?

Obrigado!

Se você estiver usando o Windows Server 2008 ou o Windows 7, precisará da permissão para ler a chave privada.

  1. Use a ferramenta FindPrivateKey para encontrar o caminho. Por exemplo:

FindPrivateKey Meu LocalMachine -n ​​”CN = MyCert” -a

ele retorna o caminho: C: \ ProgramData \ Microsoft \ Crypto \ RSA \ MachineKeys [nome do arquivo]

  1. Vá para esse caminho e abra as propriedades do arquivo

  2. Vá para a aba de segurança

  3. Clique em “Editar” e depois em “Adicionar”

  4. Na checkbox de diálogo aberta, escreva: IIS AppPool \ [nome do pool de aplicativos] e clique em OK

Agora seu pool de aplicativos tem permissão para ler essa chave privada.

Eu enfrentei este problema, meus certificados onde ter chave privada, mas eu estava recebendo este erro (” Keyset não existe “)

Causa: seu site está sendo executado na conta ” Serviços de rede ” ou com menos privilégios.

Solução: Altere a identidade do pool de aplicativos para ” Sistema Local “, redefina o IIS e verifique novamente. Se começar a funcionar, é permissão / problema de privilégio menos, você pode representar, em seguida, usando outras contas também.

Eu estava enfrentando o mesmo problema, e não sei como (que vergonha para mim), mas funcionou:

 var certificate = new X509Certificate2(filePath, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); certificate.PrivateKey; // before: error "KeySet does not exist"! using (certificate.GetRSAPrivateKey()) { } // pure black magic certificate.PrivateKey; // after: just works! lol 

Espero que alguém possa responder esse mistério.

Vano Maisuradze responde a obras. Se você estiver procurando a ferramenta FindPrivateKey, ela será incluída no Windows Communication Foundation (WCF) e no Windows Workflow Foundation (WF) Samples for .NET Framework 4, que podem ser encontrados aqui: http://www.microsoft.com/pt-br nós / download / confirmação.aspx? id = 21459

Depois de baixado e extraído, abra o projeto: WF_WCF_Samples \ WCF \ Setup \ FindPrivateKey \ CS no Visual Studio e compilá-lo. Em seguida, abra o prompt de comando e navegue até: WF_WCF_Samples \ WCF \ Setup \ FindPrivateKey \ CS \ bin

Então continue com a resposta do Vano Maisuradze

Eu acho que o problema é que você precisa adicionar a chave ao armazenamento de certificados da máquina.

As contas do Identity do Pool de Aplicativos não têm access ao armazenamento de certificados por padrão.

Você pode mudar para a conta dos Network Services conforme indicado por Vaibhav.Inspired ou você dá access ao certificado.

Para permitir o access, faça o seguinte comando:

WinHttpCertCfg.exe -g -c LOCAL_MACHINE \ MY -s “IssuedToName” -a “AccountName”

Notas:

 - The tool may need to be installed first. The setup will place the tool at `C:\Program Files (x86)\Windows Resource Kits\Tools\WinHttpCertCfg.exe`. - `IssuedName` is the issuer property of the certificate that the application will attempt to access - The command must be run from command prompt with elevated privileges 

Referência: https://support.microsoft.com/pt-br/help/901183/how-to-call-a-web-service-by-using-a-client-certificate-for-authentica Etapa 2

Além disso, você precisa ativar a opção Mark this key as exportable ao instalar o certificado.