Eu tenho algum código que faz uma chamada para um serviço da web de terceiros protegido com a certificação X.509.
Se eu ligar diretamente para o código (usando um teste de unidade), ele funcionará sem problemas.
Quando implantado, esse código será chamado por meio de um serviço WCF. Adicionei um segundo teste de unidade que chama o Serviço WCF, mas isso falha com uma CryptographicException
mensagem "Keyset does not exist"
quando chamo um método no serviço Web de terceiros.
Presumo que isso ocorra porque meu Serviço WCF tentará chamar o serviço Web de terceiros usando um usuário diferente para mim.
Alguém pode lançar alguma luz adicional sobre esse assunto?
Isso é mais provável porque o usuário do IIS não tem acesso à chave privada do seu certificado. Você pode definir isso seguindo estas etapas ...
fonte
Eu tive um problema idêntico ontem à noite. As permissões na chave privada foram definidas corretamente, tudo estava aparentemente bom, exceto o erro Keyset não existe. No final, descobriu-se que o certificado foi importado para o repositório de usuários atual primeiro e depois movido para o repositório de máquinas local. No entanto - isso não moveu a chave privada, que ainda estava no
C: \ Documentos e configurações \ Administrador ...
ao invés de
C: \ Documentos e configurações \ Todos os usuários ...
Embora as permissões na chave tenham sido definidas corretamente, o ASPNET não pôde acessá-lo. Quando reimportamos o certificado para que a chave privada seja colocada na ramificação Todos os usuários, o problema desapareceu.
fonte
Para resolver o "Conjunto de chaves não existe" ao navegar no IIS: Pode ser para permissão privada
Para visualizar e conceder a permissão:
Para dar a permissão:
fonte
Teve o mesmo problema ao tentar executar o aplicativo WCF no Visual Studio. Resolvido, executando o Visual Studio como administrador.
fonte
Eu enfrentei esse problema, meus certificados estavam com chave privada, mas estava recebendo esse erro ( "O conjunto de chaves 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, é um problema de permissão / menos privilégios, você também pode se passar por outras contas.
fonte
Totalmente frustrante, tive o mesmo problema e tentei a maioria dos itens acima. O certificado exportado corretamente tinha permissões para ler o arquivo
C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
, no entanto, como se vê, ele não tinha permissão na pasta. Adicionado e funcionoufonte
IISAPPPool\www.mywebsite.com
que é as janelas nome de usuário para o meu appool e funcionou :-)Eu tenho um problema exatamente semelhante também. Eu usei o comando
o resultado mostra que a chave privada está na pasta c: \ ProgramData em vez de C: \ Documents and settngs \ All users ..
Quando eu excluo a chave da pasta c: \ ProgramData, execute novamente o comando findPrivatekey. ie não encontra a chave.
Mas se eu procurar a mesma chave retornada pelo comando anterior, ainda posso encontrar a chave em
C: \ Documentos e configurações \ Todos os usuários ..
Pelo que entendi, o IIS ou o WCF hospedado não está encontrando a chave privada em C: \ Documents and settngs \ All users ..
fonte
Eu estava recebendo o erro: CryptographicException 'Keyset is not exist' quando executo o aplicativo MVC.
A solução foi: conceder acesso aos certificados pessoais à conta em que o pool de aplicativos está sendo executado. No meu caso, foi adicionar o IIS_IUSRS e escolher o local certo resolveu esse problema.
fonte
A resposta de Steve Sheldon corrigiu o problema para mim, no entanto, como estou criando scripts de permissões de certificado sem uma GUI, precisava de uma solução com script. Eu lutei para descobrir onde minha chave privada estava armazenada. A chave privada não estava inserida
-C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys
; eventualmente, descobri que estava realmente inseridaC:\ProgramData\Microsoft\Crypto\Keys
. Abaixo, descrevo como descobri isso:Eu tentei,
FindPrivateKey
mas não foi possível encontrar a chave privada e, usando o PowerShell, o valor$cert.privatekey.cspkeycontainerinfo.uniquekeycontainername
era nulo / vazio.Felizmente,
certutil -store my
listei o certificado e me deu os detalhes necessários para criar o script da solução.Em seguida, verifiquei
c\ProgramData\Microsoft\Crypto\
a pasta e localizei o arquivo 8787033f8ccb5836115b87acb_ca96c65a-4b42-a145-eee62128a em C: \ ProgramData \ Microsoft \ Crypto \ Keys .Ao fornecer acesso de leitura à minha conta de serviço, esse arquivo corrigiu os problemas para mim
fonte
Encontrei algumas informações ausentes que me ajudaram a obter meu serviço WCF com segurança no nível de mensagem além do "Conjunto de chaves não existe" em que eu continuava encontrando, apesar de conceder permissões para todas as chaves geradas nos exemplos na Internet.
Finalmente, importei a chave privada para o armazenamento de pessoas confiáveis na máquina local e, em seguida, concedi à chave privada as permissões corretas.
Isso preencheu os espaços em branco para mim e finalmente me permitiu implementar o serviço WCF com segurança no nível de mensagem. Estou construindo um WCF que deve ser compatível com HIPPA.
fonte
Acabei de reinstalar meu certificado na máquina local e ele está funcionando bem
fonte
Se você usar ApplicationPoolIdentity para seu pool de aplicativos, poderá ter problemas ao especificar a permissão para esse usuário "virtual" no editor de registro (não existe esse usuário no sistema).
Portanto, use subinacl - ferramenta de linha de comando que permite definir ACLs de registro ou algo assim.
fonte
Eu só queria adicionar uma resposta de verificação de sanidade. Eu estava recebendo o mesmo erro mesmo depois de instalar os certificados nos armazenamentos certos nas minhas máquinas e ter todos os privilégios de segurança certos para o cliente. Acontece que eu misturei meu clientCertificate e meu certificado de serviço. Se você tentou todas as opções acima, eu checaria duas vezes se você tem essas duas retas. Depois disso, meu aplicativo chamou com êxito o serviço da web. Mais uma vez, apenas um verificador de sanidade.
fonte
Recebeu este erro ao usar o FedAM openAM no IIS7
Alterar a conta do usuário para o site padrão resolveu o problema. Idealmente, você deseja que essa seja uma conta de serviço. Talvez até a conta IUSR. Sugira a pesquisa de métodos para o fortalecimento do IIS, para corrigir completamente.
fonte
Eu bati isso no meu projeto de malha de serviço depois que o certificado usado para autenticação contra nosso cofre de chaves expirou e foi rotacionado, o que alterou a impressão digital. Eu recebi esse erro porque perdi a atualização da impressão digital no arquivo applicationManifest.xml neste bloco, que faz exatamente o que outras respostas sugeriram - para obter permissões de NETWORK SERVICE (que todos os meus exs executam como, configuração padrão para o cluster azul do servicefabric) acesse o local da loja de certificados LOCALMACHINE \ MY.
Observe o valor do atributo "X509FindValue".
fonte
Esta é a única solução que funcionou para mim.
Referência 1
Referência 2
fonte
fonte