STATUS_NOT_FOUND como "Un error interno inesperado" en signtool.exe

8

Mi pregunta está relacionada con esta . Lamentablemente, esa pregunta es sobre una CA diferente (Symantec) y utiliza un token de hardware diferente (de Safenet) y aunque las soluciones proporcionadas coinciden con el código de error, las circunstancias de mi caso no (entre otras cosas, la tarjeta inteligente Parece que no tengo registrado su propio proveedor bajo HKLM\SYSTEM\CurrentControlSet\Control\Cryptography\Providers).

Estoy usando un certificado de firma de código de código abierto de certum.pl. Estoy usando el signtool.exeSDK de Windows 10.0.18362.0y veo el siguiente error (con signtool sign /v /debug):

signtool.exe sign /v /debug /a /i Certum /ph /du "https://my.url" /d "short description" /fd sha256 /tr "http://timestamp.digicert.com" /td sha256 "mysoftware.exe"
The following certificates were considered:
    Issued to: Open Source Developer, ...
    Issued by: Certum Code Signing CA SHA2
    Expires:   ...
    SHA1 hash: ...
    Issued to: Open Source Developer, ...
    Issued by: Certum Code Signing CA SHA2
    Expires:   ...
    SHA1 hash: ...
After EKU filter, 2 certs were left.
After expiry filter, 1 certs were left.
After Issuer Name filter, 1 certs were left.
After Private Key filter, 1 certs were left.
The following certificate was selected:
    Issued to: Open Source Developer, ...
    Issued by: Certum Code Signing CA SHA2
    Expires:   ...
    SHA1 hash: ...
Done Adding Additional Store
Error information: "Error: SignerSign() failed." (-1073741275/0xc0000225)
SignTool Error: An unexpected internal error has occurred.

El código de error 0xC0000225coincide exactamente con lo siguiente NTSTATUS:

//
// MessageId: STATUS_NOT_FOUND
//
// MessageText:
//
// The object was not found.
//
#define STATUS_NOT_FOUND                 ((NTSTATUS)0xC0000225L)

... lo que tiene mucho sentido, dados los HRESULTcódigos utilizados por signtool.exey el mapa de infraestructura subyacente 1: 1 a NTSTATUS(por supuesto, si se proporciona un código de instalación, HRESULTexisten códigos que no tienen nombre en ntstatus.h... lo que quiero decir es el diseño de HRESULTy NTSTATUS)

Por desgracia, esto no me dice nada, ya que es posible que no se encuentren muchas cosas en un momento dado ... al momento de escribir esto, todavía estoy tratando de reducirlo por mi cuenta usando ProcMon. Para el intento fallido, veo 592 NAME NOT FOUNDresultados en ProcMon, que debería corresponder al NTSTATUScódigo anterior ; la mayoría de ellos para claves de registro y valores.


Aquí está la signtoollínea de comando completa nuevamente:

"C: \ Archivos de programa (x86) \ Windows Kits \ 10 \ bin \ 10.0.18362.0 \ x64 \ signtool.exe" sign / v / debug / a / i Certum / ph / du " https: //my.url " / d "breve descripción" / fd sha256 / tr " http://timestamp.digicert.com " / td sha256 "mysoftware.exe"

... y sí, verifiqué que realmente está usando eso signtool.exe... de hecho, probé con x86 y x64 con rutas completas para una buena medida (mi script real envuelve algunas de las complejidades y prepara el entorno para ajustarse PATHpara poder llamar signtool.exesin su camino completo).

Curiosamente funciona cuando se firma con resúmenes SHA1 de esta manera:

"C: \ Archivos de programa (x86) \ Windows Kits \ 10 \ bin \ 10.0.18362.0 \ x64 \ signtool.exe" sign / v / debug / a / i Certum / ph / du " https: //my.url " / d "breve descripción" / t " http://timestamp.digicert.com " "mysoftware.exe"

(las diferencias son la falta /fd sha256y /td sha256también en /tlugar de /trla URL del servicio de marca de tiempo, es decir, un protocolo diferente)

La versión del software proCertum CardManager es 3.2.0.156, detalles según la siguiente captura de pantalla:

Software proCertum CardManager versión 3.2.0.156

(Es la última versión disponible en el sitio web de Certum en el momento de escribir este artículo).


Mientras tanto, intenté también con signtool.exe(x86 y 64 respectivamente) de:

  • Windows 8.1 SDK
  • Windows 10.0.17763.0 SDK

... los mismos resultados y estoy desconcertado sobre cómo puedo resolver esto.

0xC0000022L
fuente
@HansPassant: sí, esa es la pregunta que he vinculado. Ver el primer párrafo de mi pregunta. Si el error en el instalador de SafeNet fue sobre el registro de un proveedor de criptografía (o más bien la ortografía), creo que el hecho de que Certum no registre su propio proveedor descarta que esto se aplique aquí. ¿O qué me estoy perdiendo?
0xC0000022L
@HansPassant el paralelo resultó ser que en ambos casos se mencionaron los certificados EV. Aunque en mi caso el certificado no es en realidad EV.
0xC0000022L

Respuestas:

3

Resulta que el problema era una opción que no se configuró correctamente de forma predeterminada (el nombre sugiere que solo se aplica a los certificados EV, pero parece que también se aplica a los que tienen resúmenes SHA2). ¡Gracias al equipo de soporte de Certum!

Cuadro de diálogo Opciones de proCertum CardManager

Destaqué la opción relevante.

También tenga en cuenta que tuve que

  1. salga de la aplicación (de TNA, también conocida como "bandeja del sistema")
  2. iniciar la aplicación elevada desde su carpeta de programa
  3. marque la casilla
  4. presione el botón OK
  5. descartar el cuadro de mensaje (correcto)
  6. reiniciar

... cuando lo había intentado previamente sin elevación, el proceso falló. Y sí, vi el ícono de "escudo", pero supuse que la aplicación contiene la lógica para realizar la elevación (no lo hace).

Cuando volví a firmar después de reiniciar, ya no era el proCertum CardManager el que solicitaba el PIN de la tarjeta, sino Windows. Y la firma funcionó a las mil maravillas.

NB: todavía no había entradas debajo HKLM\SYSTEM\CurrentControlSet\Control\Cryptography\Providersdespués de estos pasos.

0xC0000022L
fuente