프로그래밍 방식으로 실행 파일의 인증서 세부 정보 가져오기

프로그래밍 방식으로 실행 파일의 인증서 세부 정보 가져오기

인증서 자체가 워크스테이션에 설치되어 있지 않지만 해당 특정 파일에 서명하는 데만 사용되는 경우 프로그래밍 방식으로 파일의 디지털 인증서 제목을 내보내는 것이 가능합니까?

어떻게든 파일에서 해당 정보를 추출하고 그것이 올바른지 확인해야 합니다. Python/CMD/PowerShell을 사용하는 것이 좋습니다.

내가 필요한 것

편집하다:

세부정보가 부족해서 죄송합니다.

저는 현재 다음 Python 스크립트를 사용하고 있습니다(Python 3.6에서 실행되도록 수정했습니다).http://www.zedwood.com/article/python-openssl-x509-parse-certificate내가 찾은 이 작은 도구를 사용하여 원래 실행 파일에서 추출한 .cer 파일을 구문 분석합니다(Python 3에서 작동하도록 수정했습니다).https://blog.didierstevens.com/programs/disitool/하지만 Windows certutil을 사용하여 DER로 인코딩된 바이너리에서 base-64로 변환한 후에만 가능합니다.

하지만 disitool 스크립트의 문제는 말 그대로 pefile Python 모듈을 사용하여 실행 파일 자체에서 '서명' 바이트 배열을 잘라낸다는 것입니다. 이로 인해 추출된 .cer 파일이 유효하지 않게 됩니다. 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')] 

그러나 여기에서 볼 수 있듯이 (위에 게시한 첫 번째 스크립트를 사용하여) 제대로 추출된 인증서를 구문 분석하면 작동합니다.

파싱은 잘 작동합니다.]

그래서 실행 파일에서 인증서를 추출하는 방법이 필요한 것 같아요. 또는 제 솔루션이 너무 복잡하다고 생각하신다면, 인증서의 제목 필드에서 "Redmond" 텍스트를 어떻게 얻을 수 있는지 아시는 분은 언제든지 환영합니다. :)

답변1

파워셸에서:

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

따라서 explorer.exe의 예를 사용하면 Redmond를 얻을 수 있습니다.

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

자세히 설명을 요청했으므로 Get-AuthenticodeSignatureSystem.Management.Automation.Signature 개체를 반환합니다. 몇 가지 방법으로 이를 확인할 수 있습니다. 개인적으로 나는 반환된 객체를 더 가지고 놀 수 있도록 변수에 할당하는 것을 선호합니다. 변수에 할당하면 이에 대해 배울 수 있습니다. Get-MemberPowershell의 cmdlet 중 하나여야 합니다. 이 경우:

$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...

따라서 개체에 몇 가지 메서드와 몇 가지 속성이 있음을 알 수 있습니다(알고 있듯이 모든 개체에는 있습니다). 이 경우 메서드는 모두 System.Object에서 상속된 표준 메서드입니다. 그러나 속성은 흥미 롭습니다. SignerCertificate는 원하는 것과 같으므로 어떻게 보이는지 살펴보겠습니다.

$foo.SignerCertificate


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

지문은 인증서를 식별하는 것이기 때문에 분명히 중요하지만 주제에 있는 레드먼드에 대해 질문했습니다. 이제 우리는 그것을 문자열로 얻는 방법을 알았습니다.

$foo.SignerCertificate.Subject

따라서 여기에서는 직선 문자열을 구문 분석하는 것입니다.

Powershell을 배우고 있는 것 같으니 한 가지 더 알려드리겠습니다. 정기적으로 시도해야 하는 또 다른 cmdlet은 Get-Command입니다. 이 경우 질문을 하기 전에는 Get-AuthenticodeSignature cmdlet이 존재한다는 사실조차 몰랐습니다. 그래서 나는 이렇게 했습니다:

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

답변2

powershell에서: CN에 쉼표를 사용하면 저에게 효과적이었습니다.

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

관련 정보