Não é possível importar o arquivo de chaves 'blah.pfx' - erro 'O arquivo de chaves pode estar protegido por senha'

392

Acabamos de atualizar nossos projetos do Visual Studio 2008 para o Visual Studio 2010. Todos os nossos assemblies foram fortemente assinados usando um certificado de assinatura de código da Verisign . Desde a atualização, obtemos continuamente o seguinte erro:

Não é possível importar o seguinte arquivo de chave: companyname.pfx. O arquivo de chave pode estar protegido por senha. Para corrigir isso, tente importar o certificado novamente ou instale manualmente o certificado no CSP de nome forte com o seguinte nome de contêiner de chave: VS_KEY_3E185446540E7F7A

Isso acontece em algumas máquinas de desenvolvimento e não em outras. Alguns métodos usados ​​para corrigir isso que funcionaram algumas vezes incluem:

  • Reinstalando o arquivo de chave do Windows Explorer (clique com o botão direito do mouse no arquivo PFX e clique em Instalar)
  • A instalação do Visual Studio 2010 em uma máquina nova pela primeira vez solicita a senha na primeira vez em que você abre o projeto e, em seguida, ele funciona. Em máquinas atualizadas a partir do Visual Studio 2008, você não recebe essa opção.

Tentei usar o utilitário SN.EXE (Strong Name Tool) para registrar a chave com o Strong Name CSP, conforme a mensagem de erro sugere, mas sempre que executo a ferramenta com alguma opção usando a versão que acompanha o Visual Studio 2010, SN .EXE apenas lista seus argumentos de linha de comando em vez de fazer qualquer coisa. Isso acontece independentemente dos argumentos que forneço.

Por que isso está acontecendo e quais são as etapas claras para corrigi-lo? Estou prestes a desistir das instalações do ClickOnce e da assinatura de código da Microsoft.

JasonD
fonte

Respostas:

447

Eu estava enfrentando esse problema também. Consegui resolver o problema executando
sn -i <KeyFile> <ContainerName>( instala o par de chaves em um contêiner nomeado ).

sngeralmente é instalado como parte de um Windows SDK. Por exemplo C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe. Provavelmente, este local não está no caminho de pesquisa para o seu ambiente padrão. No entanto, o "Prompt de Comando do Desenvolvedor" instalado pelo Visual Studio adiciona informações adicionais que geralmente incluem o local correto.

Com base na sua postagem, isso pareceria

sn -i companyname.pfx VS_KEY_3E185446540E7F7A

Isso deve ser executado a partir do local do seu arquivo PFX, se você tiver a solução carregada no VS 2010, basta clicar com o botão direito do mouse no arquivo pfx do Solution Explorer e escolher Abrir prompt de comando, que iniciará a ferramenta de prompt do .net 2010 em o diretório correto.

Antes de executar este comando sn, reinstalei o pfx clicando com o botão direito do mouse e escolhendo instalar, no entanto, isso não funcionou. Apenas algo a ser observado, pois pode ser a combinação de ambos que forneceu a solução.

Espero que isso ajude a resolver seu problema.

Brandon Manchester
fonte
5
Obrigado Brandon - sim, como a reinstalação manual do arquivo-chave "meio que" resolve o problema. O problema é que, assim que você faz o check-in do arquivo-chave, quaisquer outros usuários que obtiverem as últimas atualizações sobre esse arquivo-chave agora sofrerão esse erro. Se algum desses usuários verificar sua "correção" e eu receber as últimas, então minha máquina está quebrada novamente ... e assim por diante. A Microsoft iniciou um registro de problema e o atribuiu à equipe do VS2010 e à equipe do VSS.
JasonD
2
Interessante. Não encontrei esse problema ao adicionar o pfx ao novo CSP. Que eu saiba, o SN -i não altera o arquivo pfx, portanto você não precisará verificar nada posteriormente. No entanto, se você alterasse o arquivo pfx de qualquer maneira, como redefinir a senha, isso causaria um problema, pois alteraria o arquivo pfx. Sua solução foi criada com esse arquivo pfx de qualquer outra máquina? Nesse caso, o arquivo pfx está correto, mas não definido como o CSP correto em sua máquina que está tendo problemas de compilação.
Brandon Manchester
3
No começo, tentei apenas a parte sn -i, mas ela reclamou que a senha estava incorreta (embora estivesse correta). Eu removi o certificado, reinstalei-o e depois sn -i ... funcionou. Basicamente, confirmando que, para mim, as duas etapas foram necessárias. Reinstale o cert e execute o comando sn.
Dodgyrabbit
11
Descobri no VSS e no TFS que, se você executar o comando sn -i, ele não funcionará, a menos que você tenha verificado o arquivo PFX e, quando o fizer, não funcionará para outros desenvolvedores da rede. Vou ter que tentar o re-install cert e executar o comando sn -i. Precisamos que ele funcione em todas as máquinas de desenvolvedor no escritório.
JasonD
5
Isso funcionou para mim também, no entanto, eu nunca tive que fazer isso no passado. O VS costumava aparecer e pedir a senha para cada chave. O que mudou?
Kevin Berridge
126

Descobri uma correção que ajuda você a criar com êxito em um ambiente de vários desenvolvedores:

Em vez de alterar a senha (que faz com que o arquivo .pfx seja alterado), selecione novamente o arquivo .pfx na caixa de combinação. Isso então chama a caixa de diálogo de senha. Após digitar a senha, o projeto será construído OK. Todo desenvolvedor pode fazer isso em sua máquina local sem modificar o arquivo .pfx.

Ainda estou tendo problemas para conseguir que os assemblies sejam assinados em nossa máquina do servidor de compilação. Estou recebendo o mesmo erro lá, no entanto, o uso do método sn.exe -i não resolve o problema do buildserver.

Caixa Mágica
fonte
5
Também não consegui fazer isso funcionar em nosso servidor de compilação TFS, percebi que estava conectado como eu, não como a conta do serviço de compilação, não admira que não tenha conseguido encontrá-lo - doh!
Daniel Morritt
7
Isso deve ser marcado como a resposta, pois a resposta atualmente marcada não funcionará em um ambiente de vários desenvolvedores. Bem feito.
precisa saber é o seguinte
Se você estiver usando o mesmo arquivo .pfx para assinar vários assemblies / projetos em uma solução, será necessário executar esta etapa em um projeto e ele será aplicado a todos eles. Funciona bem.
22812 Jon Jonstom
11
Meu problema era que o servidor de compilação estava sendo executado em uma conta local. Eu entrei nas opções e mudei, mas não percebi que a mudei no lugar errado - o que me levou a solucionar problemas por horas até que eu a checasse novamente e percebesse o meu erro!
The Muffin Man
3
Agradecimentos brilhantes. É triste ver que isso ainda é uma solução alternativa em 2017.
Billy Jake O'Connor
43

Eu tive o mesmo problema e excluir a loja e a leitura não funcionou. Eu tive que fazer o seguinte.

  • Obtenha uma cópia do OpenSSL . Está disponível para Windows . Ou use uma caixa Linux, pois todas elas praticamente a possuem.

  • Execute o seguinte para exportar para um arquivo de chave:

    openssl pkcs12 -in certfile.pfx -out backupcertfile.key
    
    openssl pkcs12 -export -out certfiletosignwith.pfx -keysig -in backupcertfile.key
    

Em seguida, nas propriedades do projeto, você pode usar o arquivo PFX.

Encalhado
fonte
11
Obrigado!! Eu acho que isso funcionou para mim. Eu peguei o openssl aqui: gnuwin32.sourceforge.net/packages/openssl.htm
aherrick
Gostaria de adicionar a opção para incluir o certificado real no pfx: openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt -keysig -keyex
Pete
Certifique-se de executar o openssl como administrador, caso contrário, você receberá o erro "incapaz de escrever 'estado aleatório'". Além disso, eu ainda precisava responder a Brandon Manchester com a coisa "sn -i ..." depois de fazer o openssl coisa.
Lee Richardson
Esta é a única solução, que finalmente me deu certo. Obrigado!
28519 Ladislav
37

Eu falei muito cedo! A reconstrução trouxe os erros de volta ao jogo ...

Descobri que isso funciona - clique com o botão direito do mouse no Solution Explorer e exclua-o do projeto. Clique em Mostrar todos os arquivos , clique com o botão direito do mouse e agora inclua-o no projeto novamente. Agora desfazer alterações pendentes ...

Por alguma razão, isso resolveu o problema para mim e foi relativamente indolor!

Mike F
fonte
Levando de volta, não ajudou. Não sabia que removeu o pfx das configurações do projeto. Eu acho que a resposta está na resposta de Stefan stackoverflow.com/a/14644793/1735721 #
DennisWelu
Esta resposta é ótima. Funcionou para mim e é tão fácil.
Ben Rubin
Trabalhou para mim (VS2017 15.7.4). Obrigado pela solução agradável e rápida.
Meeting Attender
Trabalhou para mim no VS2019 16.1.3. Obrigado!!
JordanTDN
35

Descobri que, em alguns casos, você deve tentar excluir essa chave antes de instalá-la. Faça o seguinte:

  1. sn -d VS_XXXX
  2. sn -i mykey.pfx VS_XXX
Dariusz
fonte
11
Isso consertou para mim! A instalação por si só estava falhando com o objeto já existe.
Andy
Eu tentei isso também e não ajudou. Alguma coisa pode estar errada com o próprio certificado?
Tomáš Zato - Restabelece Monica
2
Obrigado, a remoção deve ser feita como administrador - se for executado como usuário comum, ocorrerá um erro enganoso "Contêiner de chave de nome forte não encontrado".
Astrowalker
Obrigado Seu trabalho para mim.
Rikin Patel 30/01
31

O VSCommands 2010 (plug-in do Visual Studio) pode corrigir isso automaticamente - basta clicar com o botão direito do mouse no erro e clicar em Aplicar correção no menu. Você pode obtê-lo na galeria do Visual Studio .

Jarek Kardas
fonte
11
Eu acredito que este é para a versão Pro - não tem essa opção na minha versão lite
Adam Butler
2
A versão que acabei de baixar (em setembro de 2011) veio com esta opção.
Jim Conta
4
Ainda requer uma licença profissional.
John Baughman
27

Depois de tentar todas essas soluções (e muito mais), descobri que o problema está em outro lugar. Para pessoas que passam pela mesma miséria que eu depois de comprar um certificado, compartilharei a solução para o meu problema.

Comportamento

Entendo que 'sign' aplica um nome forte e não um authenticode a uma DLL ou EXE. É por isso que signtool vai funcionar neste caso, mas 'sinal' no Visual Studio não funcionará.

Razão

No passado, eu tinha experiência com certificados da Verisign. Eles têm um KeySpec=2no certificado - que é usado com a funcionalidade 'assinar' no Visual Studio. Esses certificados funcionam bem para o Visual Studio e o signtool.

Agora comprei certificados da Comodo, que estão incorretos KeySpec=1nos certificados de assinatura de código. Isso significa que esses certificados funcionam bem com signtool (authenticode), mas não com nomes fortes (o sinal suspenso).

Solução

Existem duas maneiras de resolver esse problema:

  1. Crie um certificado separado para o seu nome forte usando sn -k [name].snk. Assine o assembly usando o snk e depois use o signtool com seu certificado de assinatura de código para assinar o DLL / EXE com a assinatura authenticode. Embora isso pareça estranho, pelo que entendi, é uma maneira correta de lidar com certificados, porque nomes fortes têm um propósito diferente do authenticode (consulte também este link para obter detalhes sobre como isso funciona).
  2. Importe seu certificado como KeySpec=2. O procedimento para isso é detalhado aqui .

Como quero usar vários nomes fortes, atualmente uso a opção (1), embora a opção (2) também funcione.


Para garantir que essa solução nunca se perca no futuro, eis o procedimento da solução 2:

  1. O uso do MMC "Certifiates" exporta o conjunto de chaves existente ( KeySpec=1) para um arquivo PFX. Nota: Faça o backup deste arquivo em um local seguro e teste se o arquivo pode ser importado ok em outra máquina, se você realmente quiser jogar em segurança!
  2. Exclua o certificado existente do armazenamento criptográfico (stlll usando o MMC).
  3. Abra um prompt do CMD.
  4. Importe o arquivo PFX usando este comando:
    1. certutil -importPFX -user <pfxfilename> AT_SIGNATURE
    2. Digite a senha para o pfx quando solicitado.

Agora você deve ter um conjunto de chaves / certificado com KeySpec=2. Se necessário, agora você pode exportar isso para outro arquivo PFX usando o MMC novamente.

atlaste
fonte
Sua solução nº 2 foi a única coisa que funcionou para mim (sem usar uma ferramenta ou processo secundário da linha de comando) Obrigado.
Bron Davies
11
Sim, eu realmente não entendo por que algumas soluções aqui têm tantos votos; essa é realmente a única coisa que funcionou para mim e tenho certeza de que a maioria das pessoas que compra um certificado CS deve ter o mesmo problema. Oh bem ...
atlaste
11
Esta é a única solução que funcionou para mim. Além disso, o arquivo .pfx não pode incluir informações de encadeamento de certificados para assinar assemblies.
Shih-Wen Su
Obrigado por uma instrução tão detalhada. Cada passo é descrito com precisão.
Dmitriy
11
Sua primeira solução é fundamental para entender aqui: não há absolutamente nenhuma necessidade de assinar assemblies com um certificado caro protegido por senha! Depois de entender isso e simplesmente usar um arquivo snk, esse problema desaparece completamente. Veja a nota de aviso aqui e aqui .
Paulo
11

Para resolver esse problema no Visual Studio 2012, clique com o botão direito do mouse no projeto, propriedades -> "assinatura" e desmarque a caixa "Assinar os manifestos do ClickOnce".

Romeo
fonte
2
Esta é uma resposta perfeita se não for necessário assinar. Isso removerá a necessidade do projeto ser assinado.
Tom Anderson
8

Selecionei novamente o arquivo Key (pfx) na caixa suspensa "Escolha um arquivo de chave de nome forte" e forneci a senha na janela pop-up "ENTER PASSWORD". Salvei meu projeto e reconstruiu.build com êxito.

  • Abra Propriedades do Projeto.
  • Clique na seção Assinatura.
  • Onde diz 'Escolha um arquivo de chave de nome forte:', selecione novamente o valor atual na caixa suspensa:

insira a descrição da imagem aqui

  • O Visual Studio agora solicitará a senha. Digite.

insira a descrição da imagem aqui

  • Salve seu projeto e faça uma reconstrução.

  • Se receber a mensagem de erro: "Foi feita uma tentativa de referenciar um token que não existe", apenas ignore-o e Continue as etapas abaixo

  • Clique no botão 'Alterar senha':

insira a descrição da imagem aqui

  • Digite a senha original nas três caixas e clique em OK. Se você deseja alterar sua senha (ou se sua senha antiga não atender aos requisitos de complexidade), faça isso agora.

  • Salve seu projeto e faça uma reconstrução.

Mais informações..

Bala Kumar
fonte
3
Todo esse erro parece ser completamente aleatório para resolver, mas essa solução funcionou para mim. Se alguém chegar tão longe na página, só posso sugerir que tente tudo.
precisa saber é o seguinte
6

Como solução alternativa, tentei executar o Visual Studio 2010 como administrador e funcionou para mim.

Eu espero que isso ajude.

user350076
fonte
Por algum motivo, parou de funcionar. Eu não podia acreditar que isso realmente resolveu o problema. Obrigado!!!
Gerhard Powell #
4

Como autor original da solução alternativa no relatório de bug de conexão, há DUAS variantes desta mensagem (descobri mais tarde)

Para uma variante, você usa sn.exe (geralmente se estiver fazendo uma nomeação forte) para importar a chave para o armazenamento de nomeação forte.

A outra variante para a qual você usa o certmgr para importar é quando você está assinando um código para coisas como implantação clique uma vez (observe que você pode usar o mesmo certificado para os dois propósitos).

Espero que isto ajude.

PeterI
fonte
Sim, tentamos aquele com suporte da Microsoft também, e é assim que fazemos a importação de assinatura de código. O problema realmente parece ser que a senha do certificado é perdida durante a fonte do processo de check-in com segurança. Mas isso não parece ser o problema real. Parece que, se você digitar os detalhes do certificado na máquina nº 1 do Widnows 7 e, em seguida, mover exatamente o mesmo arquivo para uma máquina diferente e registrá-lo, o registro funcionará, mas a compilação falhará. A Microsoft ainda está procurando por nós. Por enquanto, tivemos que desativar a assinatura de código e assinar manualmente durante o lançamento.
JasonD 21/05
3

Nada funcionou para mim, mas fui ver o gerenciador de certificados (mmc.exe). O certificado não foi importado na loja pessoal, então eu o importei manualmente e, em seguida, o projeto foi compilado.

Consulte Assinatura de manifesto ClickOnce e assinatura de assembly com nome forte usando a página de assinatura do Visual Studio Project Designer, assinando assemblies .

Samuel
fonte
Isso resolveu o problema para mim também após a correção SN.exe -i.
CodingSamurai
2

Selecionar novamente o arquivo da chave em uma caixa de combinação e digitar a senha ajuda nisso.

Mas é necessário fazer isso sempre que o arquivo-chave for alterado e parece não estar OK.

user1113289
fonte
2

Eu tive o mesmo problema depois de mudar minha instalação do Windows para um SSD . Nenhuma das outras soluções funcionou para mim.

Minha solução foi abrir o arquivo do projeto no bloco de notas e remover todas as referências às teclas PFX. Depois que o arquivo for salvo, abra a solução no Visual Studio. Vá para projeto -> Propriedades -> Assinatura. Você não verá nenhuma chave listada na caixa de combinação 'escolha o arquivo de chave de nome forte'. Na caixa de combinação, navegue até a chave, selecione-a e seu projeto agora pode ser criado.

GoalMaker
fonte
2

Meu problema era que o TFS Build Controller estava sendo executado como um serviço de rede e, por algum motivo, não entendi por que os certificados de serviço do Visual Studio Build Host não estavam sendo usados. Alterei a identidade do serviço de criação do Visual Studio para algo mais gerenciável, verifiquei se ele tinha direitos no servidor TFS e adicionei manualmente os certificados usando o MMC.

O problema também era que o MSBuild não pode adicionar os certificados protegidos por senha ao armazenamento.

Sentinela
fonte
Em qual loja você precisa adicioná-lo?
Feldez #
Fiz o mesmo (e também coloquei certs neste usuário Pessoal / Raiz Confiável / Pub Confiável .. não tenho certeza de qual a corrigiu) e fui capaz de passar para o próximo erro TFS que eu tinha em áreas de trabalho conflitantes, para corrigir que eu também tinha para remover e adicionar um novo agente de construção.
Feldez #
2

Eu tive um problema semelhante, mas depois de selecionar o pfx em uma caixa de combinação "Arquivo de chave de nome forte" e digitar a senha, ainda recebi um erro semelhante (sem a parte do nome do contêiner):

Não é possível importar o seguinte arquivo de chave: companyname.pfx. O arquivo de chave pode estar protegido por senha. Para corrigir isso, tente importar o certificado novamente ou instale manualmente o certificado

Além disso, o painel de informações do certificado "Assine os manifestos do ClickOnce" não foi preenchido.

Eu fiz "Selecionar do arquivo ..." no meu pfx e resolveu o problema.

surfen
fonte
1

Todos os métodos descritos aqui não me ajudaram. Mas quando excluí o arquivo * .pfx do meu projeto e o adicionei à assinatura do assembly novamente, construí meu projeto sem nenhum erro! Não sei explicar os motivos. Mas funcionou para mim.

Peter Barbanyaga
fonte
1

Ok, isso funcionou para mim. Abra a solução / projeto antigo como administrador no Visual Studio 2010 e abra a solução / projeto novo ou copiado. Como administrador, remova o arquivo pfk copiado na nova solução / projeto do Visual Studio 2010 e vá para as propriedades do projeto e desmarque-o.

Com os dois projetos abertos, copie e cole para o novo. Vá para as propriedades do projeto e selecione Build. Abri e fechei o Visual Studio e também após removê-lo do novo projeto construí-lo antes de copiá-lo do projeto antigo e selecioná-lo. Recebi o erro no início deste post primeiro quando copiei o projeto e tentei construí-lo.

Jason Robertson
fonte
1

No meu cenário, o serviço de compilação não estava usando a mesma conta de usuário que importou a chave usando sn.exe .

Depois de alterar a conta para minha conta de administrador, tudo está funcionando bem.

Mathias Lykkegaard Lorenzen
fonte
Eu estava tendo o mesmo problema, ler seu comentário me indicou o fato de que eu havia atualizado para o Windows 10 do Windows 7 e agora o VS precisava ser executado como administrador. Então executei o VS como administrador e sem problemas
.. Obrigado
1

Isso resolveu o meu problema: Abra seu projeto do VS

Clique duas vezes em Package.appxmanifest

Vá para a guia Packaging

clique em escolher certificado

clique em configurar certificado

selecione do arquivo e use example.pfx essa unidade ou qualquer outra coisa criada

Milad Xandi
fonte
0

Resolvi esse problema alterando a seguinte linha no arquivo .csproj do projeto Visual Studio:

Isso gerou o erro 'não é possível importar':

<PropertyGroup>
<SignManifests>true</SignManifests>
</PropertyGroup>

Alterar o valor para false fez com que o erro desaparecesse.

Kyle Julé
fonte
7
Geralmente, os assemblies são assinados com o objetivo de remover o SignManifests causaria problemas na implantação em alguns ambientes. Portanto, não é uma solução para um problema
Georgy Smirnov
0

Eu recebi o mesmo erro. No meu caso, tentei todas as opções acima, mas não consegui o resultado.

Finalmente, percebi que, no meu caso, o motivo do erro foi que a senha do certificado não foi inserida ou inserida incorretamente. O erro desapareceu quando inseri a senha dinamicamente corretamente. bem sucedido

Hamit YILDIRIM
fonte
0

Infelizmente, nenhuma abordagem mencionada aqui funcionou para mim. Preciso registrar o PFX do casal em um contêiner de docker e preciso passar a senha via linha de comando.

Então, eu re-desenvolvi o sn.exe -i <infile> <container>comando em C # usando o RSACryptoServiceProvider . A fonte e o aplicativo estão no GitHub no SnInstallPfx projeto .

O SnInstallPfx aplicativo aceita uma chave PFX e sua senha. Ele calcula o nome do contêiner de chave (VS_KEY_ *) automaticamente (emprestado do código-fonte do MSBuild) e o instala no nome forte CSP.

Uso:

SnInstallPfx.exe <pfx_infile> <pfx_password>
// or pass a container name if the default is not what you need (e.g. C++)
SnInstallPfx.exe <pfx_infile> <pfx_password> <container_name>
Honzajscz
fonte
0

Para quem está usando os corredores do GitLab:

  • Certifique-se de executar o corredor com uma conta na qual você possa fazer logon:./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD" (tive que parar e desinstalar primeiro)
  • siga este guia para conceder a compilação usuário de permissão para efetuar login como um serviço
  • logon com essa compilação usuário de
  • use o comando sugerido em outras respostas: sn -i certificate.pfx VS_KEY_C***6

o nome do contêiner é sugerido na saída da tarefa com falha no GitLab (saída msbuild) insira a descrição da imagem aqui

Michele mpp Marostica
fonte