No se puede importar el archivo de claves 'blah.pfx' - error 'El archivo de claves puede estar protegido con contraseña'

392

Acabamos de actualizar nuestros proyectos de Visual Studio 2008 a Visual Studio 2010. Todos nuestros ensambles fueron firmados con un certificado de firma de código de Verisign . Desde la actualización, recibimos continuamente el siguiente error:

No se puede importar el siguiente archivo de clave: companyname.pfx. El archivo de clave puede estar protegido con contraseña. Para corregir esto, intente volver a importar el certificado o instalarlo manualmente en el CSP de nombre seguro con el siguiente nombre de contenedor de clave: VS_KEY_3E185446540E7F7A

Esto sucede en algunas máquinas de desarrollo y no en otras. Algunos métodos utilizados para solucionar esto que funcionaron algunas veces incluyen:

  • Reinstale el archivo de clave desde el Explorador de Windows (haga clic con el botón derecho en el archivo PFX y haga clic en Instalar)
  • La instalación de Visual Studio 2010 en una máquina nueva por primera vez le solicita la contraseña la primera vez que abre el proyecto, y luego funciona. En las máquinas actualizadas desde Visual Studio 2008, no obtiene esta opción.

Intenté usar la utilidad SN.EXE (Strong Name Tool) para registrar la clave con Strong Name CSP como sugiere el mensaje de error, pero cada vez que ejecuto la herramienta con alguna opción usando la versión que vino con Visual Studio 2010, SN .EXE solo enumera sus argumentos de línea de comando en lugar de hacer cualquier cosa. Esto sucede independientemente de los argumentos que proporcione.

¿Por qué sucede esto y cuáles son los pasos claros para solucionarlo? Estoy a punto de renunciar a las instalaciones de ClickOnce y la firma de código de Microsoft.

JasonD
fuente

Respuestas:

448

Me encontraba con este problema también. Pude resolver el problema ejecutando
sn -i <KeyFile> <ContainerName>( instala un par de claves en un contenedor con nombre ).

sngeneralmente se instala como parte de un SDK de Windows. Por ejemplo C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\sn.exe. Lo más probable es que esta ubicación no se encuentre en la ruta de búsqueda de su entorno estándar. Sin embargo, el "Símbolo del sistema del desarrollador" instalado por Visual Studio agrega información adicional que generalmente incluye la ubicación correcta.

Según tu publicación, se vería así

sn -i companyname.pfx VS_KEY_3E185446540E7F7A

Esto debe ejecutarse desde la ubicación de su archivo PFX, si tiene la solución cargada en VS 2010, simplemente puede hacer clic con el botón derecho en el archivo pfx desde el explorador de soluciones y elegir Abrir símbolo del sistema que abrirá la herramienta de solicitud de cmd .net 2010 en El directorio correcto.

Antes de ejecutar este comando sn, reinstalé el pfx haciendo clic derecho sobre él y seleccionando instalar, sin embargo, eso no funcionó. Solo algo a tener en cuenta, ya que podría ser la combinación de ambos que proporcionó la solución.

Espero que esto ayude a resolver tu problema.

Brandon Manchester
fuente
55
Gracias Brandon, sí, al igual que la reinstalación manual del archivo de claves "tipo de" resuelve el problema. El problema es que tan pronto como ingrese el archivo de clave, cualquier otro usuario que obtenga la última versión de este archivo de clave ahora experimentará este error. Si alguno de esos usuarios ingresa su "arreglo" y obtengo la última versión, entonces mi máquina ahora está rota nuevamente ... y así sucesivamente. Microsoft ha comenzado un ticket de problema en esto y lo asignó al equipo VS2010 y al equipo VSS.
JasonD
2
Interesante. No me encontré con ese problema al agregar el pfx al nuevo CSP. Que yo sepa, SN -i no cambia el archivo pfx, por lo que no debería tener que verificar nada después. Sin embargo, si tuviera que cambiar el archivo pfx de todos modos, como restablecer la contraseña, eso causaría un problema, ya que cambiaría el archivo pfx. ¿Su solución se construye con ese archivo pfx desde cualquier otra máquina? Si es así, el archivo pfx es correcto, pero no está configurado en el CSP correcto en su máquina que tiene problemas de compilación.
Brandon Manchester
3
Al principio probé solo la parte sn -i pero se quejó de que la contraseña era incorrecta (aunque era correcta). Eliminé el certificado, lo reinstalé y luego sn -i ... funcionó. Básicamente confirmando que para mí, ambos pasos fueron necesarios. Vuelva a instalar cert y luego ejecute el comando sn.
Dodgyrabbit
1
En VSS y TFS descubrí que si ejecuta el comando sn -i no funciona a menos que haya desprotegido el archivo PFX, y cuando lo registra no funciona para otros desarrolladores en la red. Tendré que probar el certificado de reinstalación y luego ejecutar el comando sn -i. Necesitamos que funcione en todas las máquinas desarrolladoras de la oficina.
JasonD
55
Esto también funcionó para mí, sin embargo, nunca tuve que hacer esto en el pasado. VS solía aparecer y pedir la contraseña para cada clave. ¿Que ha cambiado?
Kevin Berridge
126

He descubierto una solución que te ayuda a poder construir con éxito en un entorno de múltiples desarrolladores:

En lugar de cambiar la contraseña (lo que hace que se cambie el .pfx ), vuelva a seleccionar el archivo .pfx del cuadro combinado. Esto invoca el diálogo de contraseña. Después de ingresar la contraseña, el proyecto se compilará correctamente. Cada desarrollador puede hacer esto en su máquina local sin modificar realmente el archivo .pfx.

Todavía tengo problemas para que se firmen ensamblados en nuestra máquina del servidor de compilación. Recibo el mismo error, sin embargo, el uso del método sn.exe -i no soluciona el problema para el servidor de compilación.

Caja Magica
fuente
55
Pasé un tiempo sin lograr que esto funcionara también en nuestro servidor de compilación TFS, me di cuenta de que había iniciado sesión como yo mismo, no como la cuenta del servicio de compilación, no es de extrañar que no haya podido encontrarlo, ¡sí!
Daniel Morritt
77
Esto debe marcarse como la respuesta ya que la respuesta que está marcada actualmente no funcionará en un entorno de desarrolladores múltiples. Bien hecho.
Daniel McQuiston
Si está utilizando el mismo archivo .pfx para firmar múltiples ensamblados / proyectos dentro de una solución, solo necesita realizar este paso en un proyecto y se aplicará a todos ellos. Funciona genial.
Jon Comtois
1
Mi problema fue que el servidor de compilación se ejecutaba con una cuenta local. Entré en las opciones y cambié, pero no me di cuenta de que lo había cambiado en el lugar equivocado, lo que me llevó a solucionar el problema durante horas hasta que lo revisé nuevamente y me di cuenta de mi error.
The Muffin Man
3
Brillantes gracias. Sin embargo, es triste ver que esto sigue siendo una solución en 2017.
Billy Jake O'Connor
43

Tuve el mismo problema y eliminar la tienda y leer no funcionó. Tuve que hacer lo siguiente.

  • Obtenga una copia de OpenSSL . Está disponible para Windows . O use una caja de Linux, ya que casi todos la tienen.

  • Ejecute lo siguiente para exportar a un archivo de clave:

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

Luego, en las propiedades del proyecto, puede usar el archivo PFX.

Varado
fuente
1
¡¡Gracias!! Creo que esto funcionó para mí. Tomé openssl aquí: gnuwin32.sourceforge.net/packages/openssl.htm
aherrick
Me gustaría agregar la opción para incluir el certificado real en el pfx: openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt -keysig -keyex
Pete
Asegúrese de ejecutar openssl como administrador, de lo contrario obtendrá el error "no se puede escribir 'estado aleatorio'". Además: todavía tenía que hacer la respuesta de Brandon Manchester con la cosa "sn -i ..." después de hacer el openssl cosa.
Lee Richardson el
Esta es la única solución, que finalmente me funcionó. ¡Gracias!
Ladislav
37

¡Hablé muy pronto! Reconstruir devolvió los errores al juego ...

Encontré que esto funciona: haga clic derecho en el Explorador de soluciones y excluirlo del proyecto. Haga clic en Mostrar todos los archivos , haga clic derecho y ahora inclúyalo nuevamente en el proyecto. Ahora deshacer los cambios pendientes ...

¡Por alguna razón, esto lo resolvió para mí y fue relativamente indoloro!

Mike F
fuente
Retirándolo, no ayudó. No me di cuenta de que eliminó el pfx de la configuración del proyecto. Creo que la respuesta se encuentra en la respuesta de Stefan stackoverflow.com/a/14644793/1735721
DennisWelu
Esta respuesta es genial. A mí me funcionó y es muy fácil.
Ben Rubin
Trabajó para mí (VS2017 15.7.4). Gracias por la solución agradable y rápida.
Attender de la reunión el
Trabajó para mí en VS2019 16.1.3. ¡¡Gracias!!
JordanTDN
35

Descubrí que en algunos casos deberías intentar eliminar esta clave antes de instalarla. Entonces haga lo siguiente:

  1. sn -d VS_XXXX
  2. sn -i mykey.pfx VS_XXX
Dariusz
fuente
1
¡Esto me lo arregló! La instalación por sí misma estaba fallando con el objeto ya existe.
Andy
Intenté eso también y no ayudó. ¿Podría algo estar mal con el certificado en sí?
Tomáš Zato - Restablece a Monica
2
Gracias, la eliminación debe hacerse como administrador : si se ejecuta como usuario normal, se obtiene un error engañoso "No se encontró el contenedor de clave de nombre seguro ".
astrowalker
Gracias, es trabajo para mí.
Rikin Patel
31

VSCommands 2010 (plugin para Visual Studio) puede solucionar esto automáticamente, simplemente haga clic derecho en error y haga clic en Aplicar corrección en el menú. Puede obtenerlo de la galería de Visual Studio .

Jarek Kardas
fuente
1
Creo que esto es para la versión pro - no tengo esta opción en mi versión lite
Adam Butler
2
La versión que acabo de descargar (en septiembre de 2011) vino con esta opción.
Jim cuenta el
44
Todavía requiere una licencia profesional.
John Baughman
27

Después de probar todas estas soluciones (y muchas más), descubrí que el problema radica en otro lugar. Para las personas que pasan por la misma miseria que yo después de comprar un certificado, compartiré la solución para mi problema.

Comportamiento

Entiendo que 'signo' aplica un nombre seguro y no un código de autenticación a un archivo DLL o EXE. Esta es la razón por signtool se trabajará en este caso, pero 'signo' en el estudio visual no va a funcionar.

Razón

En el pasado he tenido experiencia con certificados de Verisign. Tienen un KeySpec=2certificado en el certificado, que se usa con la funcionalidad 'firmar' en Visual Studio. Estos certificados funcionan bien tanto para Visual Studio como para signtool.

Ahora compré certificados de Comodo, que tienen un KeySpec=1certificado de firma de código incorrecto . Eso significa que estos certificados funcionan bien con signtool (authenticode) pero no con nombres fuertes (el menú desplegable de signos).

Solución

Hay dos formas de resolver este problema:

  1. Cree un certificado separado para su nombre seguro usando sn -k [name].snk. Firme el ensamblaje utilizando el snk y luego use signtool con su certificado de firma de código para firmar el archivo DLL / EXE con la firma de autenticación. Si bien esto parece extraño, por lo que entiendo, esta es una forma correcta de tratar con los certificados, porque los nombres seguros tienen un propósito diferente al de la autenticación (consulte también este enlace para obtener detalles sobre cómo funciona).
  2. Importa tu certificado como KeySpec=2. El procedimiento para esto se detalla aquí .

Como quiero usar varios nombres seguros, actualmente uso la opción (1), aunque la opción (2) también funciona.


Para garantizar que esta solución nunca se pierda en el futuro, este es el procedimiento de la solución 2:

  1. Usando el MMC "Certificados", exporte el conjunto de claves existente ( KeySpec=1) a un archivo PFX. Nota: ¡Haga una copia de seguridad de este archivo en una ubicación segura y pruebe si el archivo se puede importar bien en otra máquina si realmente quiere jugar de forma segura!
  2. Elimine el certificado existente de la tienda de cifrado (todavía utilizando el MMC).
  3. Abra una solicitud de CMD.
  4. Importe el archivo PFX con este comando:
    1. certutil -importPFX -user <pfxfilename> AT_SIGNATURE
    2. Ingrese la frase de contraseña para el pfx cuando se le solicite.

Ahora debe tener un conjunto de claves / certificado con KeySpec=2. Si es necesario, ahora puede exportar esto a otro archivo PFX utilizando MMC nuevamente.

atlaste
fuente
Su solución # 2 fue lo único que funcionó para mí (sin usar una herramienta o proceso secundario de línea de comandos) Gracias.
Bron Davies
1
Sí, realmente no entiendo por qué algunas soluciones aquí tienen tantos votos; Esto es realmente lo único que funcionó para mí, y estoy bastante seguro de que la mayoría de las personas que compran un certificado CS deberían tener el mismo problema. Oh bien ...
atlaste
1
Esta es la única solución que me funcionó. Además, el archivo .pfx no puede incluir información de encadenamiento de certificados para firmar ensamblados.
Shih-Wen Su
Gracias por una instrucción tan detallada. Cada paso se describe con precisión.
Dmitriy
1
Su primera solución es crítica para entender aquí: ¡no hay absolutamente ninguna necesidad de firmar con firmeza con un costoso certificado protegido por contraseña! Una vez que comprenda esto, y simplemente use un archivo snk, este problema desaparecerá por completo. Vea la nota de advertencia aquí y aquí .
Paul
11

Para resolver este problema en Visual Studio 2012, hago clic con el botón derecho en el proyecto, propiedades -> "firma", y luego desmarco la opción "Firmar los manifiestos ClickOnce".

Romeo
fuente
2
Esta es una respuesta perfecta si no hay necesidad de firmar. Eliminará la necesidad de firmar el proyecto.
Tom Anderson
8

Volví a seleccionar el archivo Clave (pfx) en el cuadro desplegable "Elegir un archivo de clave de nombre seguro", luego proporcioné la contraseña en la ventana emergente "INTRODUCIR CONTRASEÑA". Guarde mi proyecto y lo hice rebuild.build tuvo éxito.

  • Abrir propiedades del proyecto.
  • Haga clic en la sección Firma.
  • Donde dice 'Elija un archivo de clave de nombre seguro:', vuelva a seleccionar el valor actual del cuadro desplegable:

ingrese la descripción de la imagen aquí

  • Visual Studio ahora le pedirá la contraseña. Ingresarlo.

ingrese la descripción de la imagen aquí

  • Guarda tu proyecto y haz una reconstrucción.

  • Si aparece el mensaje de error: "Se intentó hacer referencia a un token que no existe", simplemente ignórelo y continúe con los pasos a continuación.

  • Haga clic en el botón "Cambiar contraseña":

ingrese la descripción de la imagen aquí

  • Ingrese la contraseña original en los tres cuadros y haga clic en Aceptar. Si desea cambiar su contraseña (o si su contraseña anterior no cumple con los requisitos de complejidad), puede hacerlo ahora.

  • Guarda tu proyecto y haz una reconstrucción.

Más información..

Bala Kumar
fuente
3
Parece que todo este error es completamente aleatorio de resolver, pero esta solución funcionó para mí. Si alguien más llega tan lejos en la página, solo puedo sugerir probarlo todo.
DeusExMachina25
6

Como solución alternativa, intenté ejecutar Visual Studio 2010 como administrador, y funcionó para mí.

Espero que esto ayude.

user350076
fuente
Por alguna razón dejó de funcionar. No podía creer que esto realmente resolviera el problema. ¡¡¡Gracias!!!
Gerhard Powell
4

Como autor original de la solución del informe de error de conexión, hay DOS variantes de este mensaje (descubrí más adelante)

Para una variante, usa sn.exe (generalmente si está haciendo un nombre seguro) para importar la clave al almacén de nombres seguros.

La otra variante para la que usa certmgr para importar es cuando está firmando códigos para cosas como la implementación de hacer clic una vez (tenga en cuenta que puede usar el mismo certificado para ambos fines).

Espero que esto ayude.

PeterI
fuente
Sí, también lo probamos con soporte de Microsoft, y esa es la forma de importar el código de firma. El problema realmente parece ser que la contraseña del certificado se pierde durante el proceso de registro seguro. Pero este no parece ser el verdadero problema. Parece que si ingresa los detalles del certificado en la máquina # 1 de Widnows 7, y luego mueve exactamente ese mismo archivo a una máquina diferente y lo registra, el registro funcionará, pero la compilación fallará. Microsoft todavía lo está buscando por nosotros. Por ahora tuvimos que deshabilitar la firma de código y firmar manualmente durante el lanzamiento.
JasonD
3

Nada funcionó para mí, pero luego fui y busqué en el administrador de certificados (mmc.exe). El certificado no se importó en la tienda personal, así que lo importé manualmente y luego el proyecto se compiló.

Consulte Firma de manifiesto de ClickOnce y Firma de ensamblaje de nombre seguro mediante la página de firma del Diseñador de proyectos de Visual Studio, Firmando ensamblajes .

Samuel
fuente
Esto resolvió el problema para mí también después de hacer la solución SN.exe -i.
CodingSamurai
2

Volver a seleccionar el archivo de clave en un cuadro combinado e ingresar la contraseña nos ayuda en esto.

Pero es necesario hacerlo cada vez que cambia el archivo de clave y parece que no está bien.

usuario1113289
fuente
2

Tuve el mismo problema después de mover mi instalación de Windows a un SSD . Ninguna de las otras soluciones funcionó para mí.

Mi solución fue abrir el archivo del proyecto en el Bloc de notas y eliminar todas las referencias a las teclas PFX. Una vez que se guarda el archivo, abra la solución en Visual Studio. Vaya al proyecto -> Propiedades -> Firma. No debería ver ninguna clave en el cuadro combinado 'elegir el archivo de clave de nombre seguro'. En el cuadro combinado, navegue hasta la clave, selecciónela y su proyecto ahora se puede construir.

GoalMaker
fuente
2

Mi problema era que el controlador de compilación TFS se estaba ejecutando como un servicio de red y, por alguna razón, no entendía por qué no se usaban los certificados del servicio Host de compilación de Visual Studio. Cambié la identidad del servicio Visual Studio Build a algo más manejable, me aseguré de que tuviera derechos en el servidor TFS y agregué manualmente los certificados usando la MMC.

El problema también era que MSBuild no puede agregar los certificados protegidos por contraseña a la tienda.

Centinela
fuente
¿A qué tienda necesitas agregarlo?
felickz
Hice lo mismo (y también puse certs en este usuario Personal / Trusted Root / Trusted Pub ... no estoy seguro de qué lo solucionó) y pude pasar al siguiente error de TFS que tenía espacios de trabajo en conflicto, para rectificar que también tenía para eliminar y agregar un nuevo agente de compilación.
felickz
2

Tuve un problema similar, pero después de seleccionar el pfx en un "ComboBox de archivo de clave de nombre seguro" y escribir la contraseña, aún recibí un error similar (sin la parte del nombre del contenedor):

No se puede importar el siguiente archivo de clave: companyname.pfx. El archivo de clave puede estar protegido con contraseña. Para corregir esto, intente importar el certificado nuevamente o instalarlo manualmente

Además, el panel de información del certificado "Firmar los manifiestos de ClickOnce" no se rellenó.

Hice "Seleccionar del archivo ..." en mi pfx, y resolvió el problema.

surfen
fuente
1

Todos los métodos descritos aquí no me ayudaron. Pero cuando eliminé el archivo * .pfx de mi proyecto y lo agregué a la firma del ensamblado nuevamente, ¡construí mi proyecto sin ningún error! No puedo explicar por qué. Pero funcionó para mí.

Peter Barbanyaga
fuente
1

De acuerdo, esto funcionó para mí. Abra la solución / proyecto anterior como administrador en Visual Studio 2010 y abra la solución / proyecto nuevo o copiado. Como administrador, elimine el archivo pfk copiado en la nueva solución / proyecto de Visual Studio 2010, vaya a las propiedades del proyecto y desactívelo.

Con ambos proyectos abiertos, copie y pegue en el nuevo. Vaya a las propiedades del proyecto y seleccione Construir. Abrí y cerré Visual Studio y también, después de eliminarlo del nuevo proyecto, lo construí antes de copiarlo del proyecto anterior y seleccionarlo. Recibí el error al principio de esta publicación cuando copié el proyecto e intenté compilarlo.

Jason Robertson
fuente
1

En mi caso, el servicio de compilación no usaba la misma cuenta de usuario con la que importé la clave sn.exe.

Después de cambiar la cuenta a mi cuenta de administrador, todo funciona bien.

Mathias Lykkegaard Lorenzen
fuente
Estaba teniendo el mismo problema, leer su comentario me señaló el hecho de que me había actualizado a Windows 10 desde Windows 7 y ahora VS debía ejecutarse como administrador. Así que ejecuté el VS como administrador y no
tuve
1

Esto resolvió mi problema: abra su proyecto VS

Haga doble clic en Package.appxmanifest

Vaya a la pestaña Empaquetado

haga clic en elegir certificado

haga clic en configurar certificado

seleccione del archivo y use example.pfx esa unidad o cualquier otra cosa creada

Milad Xandi
fuente
0

Resolví este problema por mí mismo cambiando la siguiente línea en el archivo .csproj del proyecto de Visual Studio:

Esto arrojó el error 'no se puede importar':

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

Cambiar el valor a falso hizo que el error desapareciera.

Kyle Julé
fuente
77
Por lo general, los ensambles se firman para su propósito, y eliminar SignManifests causaría problemas en la implementación en algunos entornos. Así que no es una solución para un problema
Georgy Smirnov
0

Tengo el mismo error. En mi caso, probé todo lo anterior, pero no pude obtener el resultado.

Finalmente me di cuenta de que en mi caso, la razón del error fue que la contraseña del certificado no se ingresó o ingresó incorrectamente. El error desapareció cuando ingresé la contraseña dinámicamente correctamente. exitoso

Hamit YILDIRIM
fuente
0

Desafortunadamente, ningún enfoque mencionado aquí funcionó para mí. Tengo que registrar un par de PFX en un contenedor acoplable y necesito pasar la contraseña a través de la línea de comandos.

Así que volví a desarrollar el sn.exe -i <infile> <container>comando en C # usando RSACryptoServiceProvider . La fuente y la aplicación están en GitHub en el proyecto SnInstallPfx .

La aplicación SnInstallPfx acepta una clave PFX y su contraseña. Calcula el nombre del contenedor de claves (VS_KEY_ *) automáticamente (tomado del código fuente de MSBuild) y lo instala en el nombre seguro 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
fuente
0

Para quién está usando los corredores de GitLab:

  • Asegúrese de ejecutar el corredor con una cuenta en la que pueda iniciar sesión: ./gitlab-runner.exe install --user ".\ENTER-YOUR-USERNAME" --password "ENTER-YOUR-PASSWORD"(tuve que detener y desinstalar primero)
  • siga esta guía para otorgar al usuario de compilación permiso para iniciar sesión como servicio
  • iniciar sesión con dicho usuario de compilación
  • use el comando sugerido en otras respuestas: sn -i certificate.pfx VS_KEY_C***6

el nombre del contenedor se sugiere en la salida de trabajo fallida en GitLab (salida de msbuild) ingrese la descripción de la imagen aquí

Michele mpp Marostica
fuente