Saltar al contenido

La firma de código con signtool falla debido a privado key filtrar

Hola, tenemos la solución a lo que buscabas, desplázate y la encontrarás a continuación.

Solución:

tuve el mismo síntoma, pero un total causa diferente. Como hacen muchos desarrolladores, tengo varias cadenas de herramientas diferentes instaladas en mi sistema. Solo los examiné para mostrar cómo se puede ver esto; desplácese hasta el final de esta respuesta para ver la lista completa.

Había instalado mi certificado de firma de código de VeriSign en el almacén de certificados del sistema (requiere /sm con signtool.exe) como de costumbre, usando certutil -importPFX cert.pfx desde un símbolo del sistema elevado.

Las primeras pruebas parecían prometedoras, pero luego, de repente, la firma comenzó a fallar.

Para depurar el problema, comencé a usar signtool.exe sign /debug /v /a /sm ... para ver qué sale mal. La salida se veía así (ver también la pregunta):

The following certificates were considered:
    Issued to: localhost
    Issued by: localhost
    Expires:   Tue Dec 26 00:00:00 2017
    SHA1 hash: <...>

    Issued to: <...>
    Issued by: Symantec Class 3 SHA256 Code Signing CA
    Expires:   <...>
    SHA1 hash: <...>

After EKU filter, 1 certs were left.
After expiry filter, 1 certs were left.
After Root Name filter, 1 certs were left.
After Private Key filter, 0 certs were left.
SignTool Error: No certificates were found that met all the given criteria.

Podría descartar al privado desaparecido key, como indica claramente la tienda de certificados tengo un pareo privado key:

Diálogo de propiedad para certificado

Ahora recuerdo que hubo algunos parches recientes que permiten que Windows 7 acepte firmas hechas con un certificado que tiene un hash SHA256. Aunque, por supuesto, la mayoría de los artículos antiguos afirman que Windows 7 no puede manejar hash SHA-2 en absoluto.

Así que esto ya me dio un empujón en la dirección de “tiene que ser una versión antigua de algo relacionado con la firma”.

I todavía decidió quitar el certificado más key y reimportarlo usando la invocación mostrada antes.

Luego, después de examinar mi sistema (ver al final de la respuesta), encontré una enorme cinco diferentes versiones de signtool.exe. Entonces comencé probando el más nuevo (6.3.9600.17298, del SDK de Windows 8.1) y funcionó de inmediato:

signtool.exe sign /debug /v /a /sm /r VeriSign /ac MSCV-VSClass3.cer /ph  /t "http://timestamp.verisign.com/scripts/timstamp.dll" *.exe

The following certificates were considered:
    Issued to: localhost
    Issued by: localhost
    Expires:   Tue Dec 26 00:00:00 2017
    SHA1 hash: <...>

    Issued to: <...>
    Issued by: Symantec Class 3 SHA256 Code Signing CA
    Expires:   <...>
    SHA1 hash: <...>

After EKU filter, 1 certs were left.
After expiry filter, 1 certs were left.
After Root Name filter, 1 certs were left.
After Private Key filter, 1 certs were left.
The following certificate was selected:
    Issued to: <...>
    Issued by: Symantec Class 3 SHA256 Code Signing CA
    Expires:   <...>
    SHA1 hash: <...>

Cross certificate chain (using machine store):
    Issued to: Microsoft Code Verification Root
    Issued by: Microsoft Code Verification Root
    Expires:   Sat Nov 01 13:54:03 2025
    SHA1 hash: 8FBE4D070EF8AB1BCCAF2A9D5CCAE7282A2C66B3

        Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
        Issued by: Microsoft Code Verification Root
        Expires:   Mon Feb 22 19:35:17 2021
        SHA1 hash: 57534CCC33914C41F70E2CBB2103A1DB18817D8B

            Issued to: Symantec Class 3 SHA256 Code Signing CA
            Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
            Expires:   Sat Dec 09 23:59:59 2023
            SHA1 hash: 007790F6561DAD89B0BCD85585762495E358F8A5

                Issued to: <...>
                Issued by: Symantec Class 3 SHA256 Code Signing CA
                Expires:   <...>
                SHA1 hash: <...>


The following additional certificates will be attached:
    Issued to: VeriSign Class 3 Public Primary Certification Authority - G5
    Issued by: Microsoft Code Verification Root
    Expires:   Mon Feb 22 19:35:17 2021
    SHA1 hash: 57534CCC33914C41F70E2CBB2103A1DB18817D8B

    Issued to: Symantec Class 3 SHA256 Code Signing CA
    Issued by: VeriSign Class 3 Public Primary Certification Authority - G5
    Expires:   Sat Dec 09 23:59:59 2023
    SHA1 hash: 007790F6561DAD89B0BCD85585762495E358F8A5

Done Adding Additional Store
Successfully signed: <...>.exe

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0

Al rastrear esto, pensé que había encontrado el problema. Sin embargo, resultó que el error que obtuve no es el que hubiera podido ver con los signtool.exe versiones. En cambio, las versiones anteriores se habrían quejado /ac, /fd y /ph siendo opciones de línea de comando no reconocidas, respectivamente.

Así que necesitaba profundizar un poco más y resultó que mi administrador de archivos (alternativo) era el culpable. Por lo general, inicio mis indicaciones de comando en la carpeta respectiva usando ese administrador de archivos y un práctico atajo de teclado. Resulta que a veces no pasa las variables de entorno; esencialmente, el administrador de archivos “olvida” las variables de entorno. Esta resultó ser la causa raíz. Un símbolo del sistema se abrió usando Ganar+R y luego cmdIngresar no expondría este comportamiento a pesar de ejecutar signtool.exe de la misma carpeta.

Mi mejor suposición de esto es que debido a un desastre PATH variable o similar, signtool.exe terminó eligiendo la DLL incorrecta. Notablemente mssign32.dll y wintrust.dllacompañar signtool.exe en la misma carpeta para Windows SDK 8.0 y 8.1, pero no para ninguna de las versiones anteriores de signtool.exe que seleccionará las DLL de todo el sistema “globales”, sean las que resulten ser.


En mi sistema tuve cinco diferentes versiones de signtool.exe.

signtool.exe 5.2.3790.1830

Ni siquiera entiende el /ac y /ph argumentos que estaba usando (tampoco /fd). Pero, curiosamente, funcionó sin esos dos argumentos.

  • C:Program Files (x86)Microsoft Visual Studio 8SDKv2.0Binsigntool.exe

signtool.exe 6.0.4002.0

Ni siquiera entiende el /ac y /ph argumentos que estaba usando (tampoco /fd). Pero, curiosamente, funcionó sin esos dos argumentos.

  • C:Program Files (x86)Microsoft Visual Studio 8Common7ToolsBinsigntool.exe

signtool.exe 6.1.7600.16385

Primera versión para entender /fd sha256.

  • C:WINDDK7600.16385.1binamd64SignTool.exe
  • C:WINDDK7600.16385.1binx86SignTool.exe
  • C:Program FilesMicrosoft SDKsWindowsv7.1Binsigntool.exe
  • C:Program Files (x86)Microsoft SDKsWindowsv7.0ABinsigntool.exe
  • C:Program Files (x86)Microsoft SDKsWindowsv7.1ABinsigntool.exe

signtool.exe 6.2.9200.20789

  • C:Program Files (x86)Windows Kits8.0binx64signtool.exe
  • C:Program Files (x86)Windows Kits8.0binx86signtool.exe

signtool.exe 6.3.9600.17298

  • C:Program Files (x86)Windows Kits8.1binarmsigntool.exe
  • C:Program Files (x86)Windows Kits8.1binx64signtool.exe
  • C:Program Files (x86)Windows Kits8.1binx86signtool.exe

Para firmar un archivo, debe tener el certificado privado key, que no está incluido en el archivo * .cer que copió de la máquina con Windows 7. Para exportar el certificado con su privado key puede seguir las instrucciones proporcionadas aquí.

Tenga en cuenta que solo podrá exportar el key si el certificado se configuró para permitir exportarlo cuando se creó (pasando -pe para makecert)

Recuerda recomendar esta división si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *