Obtener mediante programación los detalles del certificado de un ejecutable

Obtener mediante programación los detalles del certificado de un ejecutable

¿Es posible exportar de alguna manera mediante programación el asunto del certificado digital de un archivo si el certificado en sí no está instalado en la estación de trabajo sino que solo se usa para firmar ese archivo específico?

Necesito extraer de alguna manera esa información de un archivo y verificar si es correcta. Preferiblemente usando Python/CMD/PowerShell

Lo que necesito

EDITAR:

Perdón por la falta de detalles.

Actualmente estoy usando este script de Python (que modifiqué para ejecutarlo en Python 3.6):http://www.zedwood.com/article/python-openssl-x509-parse-certificatepara analizar un archivo .cer que extraje del archivo ejecutable original con esta pequeña herramienta que encontré (que también modifiqué para que funcione con Python 3):https://blog.didierstevens.com/programs/disitool/pero solo después de convertirlo de un binario codificado en DER a uno base 64 con el certificado de Windows.

Sin embargo, el problema con el script disitool es que literalmente CORTA una matriz de bytes de 'firma' del ejecutable usando el módulo pefile python, lo que invalida el archivo .cer extraído, según el error de python que sigo recibiendo al intentar cargue el certificado con el módulo OpenSSL.crypto:

 [('asn1 encoding routines', 'asn1_check_tlen', 'wrong tag'), ('asn1 encoding routines', 'asn1_item_embed_d2i', 'nested asn1 error'), ('asn1 encoding routines', 'asn1_template_noexp_d2i', 'nested asn1 error'), ('PEM routines', 'PEM_ASN1_read_bio', 'ASN1 lib')] 

Pero analizar un buen certificado extraído (con el primer script que publiqué arriba) funciona, como puedes ver aquí:

El análisis funciona bien]

Entonces, supongo que solo necesito una forma de extraer el certificado de un ejecutable. O, si mi solución le parece demasiado complicada, si tiene alguna idea de cómo podría obtener ese texto "Redmond" del campo Asunto del certificado, estoy muy abierto a ideas :)

Respuesta1

En PowerShell:

Get-AuthenticodeSignature C:\Path\TO\File.exe

Entonces, usando su ejemplo de explorer.exe esto obtendría Redmond:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split(',')[2].split('=')[1]

Como solicitó más información, Get-AuthenticodeSignaturedevuelve un objeto System.Management.Automation.Signature. Puedes descubrir esto de varias maneras. Personalmente, prefiero asignarlo a una variable para poder jugar más con el objeto devuelto. Una vez que lo haya asignado a una variable, podrá aprender cosas sobre ella. Get-Memberdebería ser uno de sus cmdlets de acceso en Powershell. En este caso:

$foo = Get-AuthenticodeSignature C:\Windows\explorer.exe
Get-Member -InputObject $foo
   TypeName: System.Management.Automation.Signature

Name                   MemberType Definition
----                   ---------- ----------
Equals                 Method     bool Equals(System.Object obj)
GetHashCode            Method     int GetHashCode()
GetType                Method     type GetType()
ToString               Method     string ToString()
IsOSBinary             Property   bool IsOSBinary {get;}
Path                   Property   string Path {get;}
SignatureType          Property   System.Management.Automation.SignatureType SignatureType {get;}
SignerCertificate      Property   System.Security.Cryptography.X509Certificates.X509Certificate2 SignerCertificate {...
Status                 Property   System.Management.Automation.SignatureStatus Status {get;}
StatusMessage          Property   string StatusMessage {get;}
TimeStamperCertificate Property   System.Security.Cryptography.X509Certificates.X509Certificate2 TimeStamperCertific...

Entonces puedes ver que el objeto tiene algunos métodos y algunas propiedades (lo sé, todos los objetos las tienen). En este caso los métodos son todos los estándar que se heredan de System.Object. Sin embargo, las propiedades son interesantes. El SignerCertificate se parece a lo que deseaba, así que veamos cómo se ve:

$foo.SignerCertificate


Thumbprint                                Subject
----------                                -------
419E77AED546A1A6CF4DC23C1F977542FE289CF7  CN=Microsoft Windows, O=Microsoft Corporation, L=Redmond, S=Washington, C=US

La huella digital es obviamente importante porque es lo que identifica el certificado, pero usted preguntó sobre el Redmond que está en el tema. Ahora sabemos cómo llegar a eso como una cadena:

$foo.SignerCertificate.Subject

Entonces, desde aquí es simplemente un análisis de cadenas directo.

Un dato más que incluiré ya que parece que estás aprendiendo Powershell. Otro cmdlet que deberías probar regularmente es Get-Command. En este caso, ni siquiera sabía que existía el cmdlet Get-AuthenticodeSignature antes de que hiciera la pregunta. Entonces hice esto:

Get-Command *signature*

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Function        Update-MpSignature                                 1.0        Defender
Cmdlet          Get-AuthenticodeSignature                          3.0.0.0    Microsoft.PowerShell.Security
Cmdlet          Save-VolumeSignatureCatalog                        1.0.0.0    ShieldedVMDataFile
Cmdlet          Set-AuthenticodeSignature                          3.0.0.0    Microsoft.PowerShell.Security

Respuesta2

en powershell: puedes tener una coma en CN, entonces esto funcionó para mí:

(Get-AuthenticodeSignature C:\Windows\explorer.exe).SignerCertificate.subject.split('=')[1].split('"=')[1]

información relacionada