2016-10-10 3 views
0

에만 잎 인증서를 검색합니다. 나는 윈도우를 사용하여 서명을 보는 경우 (마우스 오른쪽 클릭 -> 속성 -> 디지털 서명이 -> 세부 정보 -> 인증서보기 -> 경로),이 체인은 다음과 같습니다, 예상대로 :X509Certificate.CreateFromSignedFile 내가 EXE 파일이 signtool.exe을 사용하여 서명이

Verisign 
| 
---Symantec Class 3 SHA256 Code Signing CA 
    | 
    ---Me 

그러나, 나는로드하는 경우 .NET 인증서 X509Certificate.CreateFromSignedFile(path)을 사용하는 인증서이고 X509Certificate2UI.DisplayCertificate(cert)을 사용하여 인증서를 보면 잎 인증서 만 볼 수 있습니다. 물론 체인이 없기 때문에 X509Chain을 사용하여 체인을 만들려고하면 오류가 발생합니다.

이 예상되는 동작입니다 및 관리 .NET 코드를 사용하여 전체 체인을 구축 할 수있는 방법 (읽기는 WinVerifyTrust에서 피가/호출 사용하지 않고)이 있습니까?

+0

나는 당신이 나를 가리키는 위해 [이] (http://stackoverflow.com/a/9152838/4684493) 대답에 – Hintham

+0

감사 볼 필요가 있다고 생각합니다. 의심 스러울만큼, 그것은 X509Certificate2 개체를 사용하여 나에게 잎 노드를 줄 것으로 보인다. 그러나이 질문에 대한 예제는 서명 된 실행 파일에서 가져 오기가 필요한 동안 인증서 파일 (예 : pfx)을 사용하여 전체 체인을 가져 오는 것에 대해서만 설명합니다. 그게 가능하니? – MrPiao

+0

알았어. 당으로 [이] (http://security.stackexchange.com/questions/50959/how-to-check-executable-code-signing-signatures) 당신은'X509Certificate'을에서'X509Certicate2'을 만들 수있을 것입니다 서명 된 실행 파일에서 가져옵니다. 이렇게하면 확인할 수있는 인증서 체인을 만들 수 있습니다. 대략 :'var cert = X509Certificate.CreateFromSignedFile ("path \ to \ signed_file"); var cert2 = new X509Certificate2 (cert); 그리고 나서'var chain = new X509Chain(); var isValid = chain.Build (cert2); ' – Hintham

답변

0

예,없고. 당신은 "인증서보기"를 누르면 당신의 UI 워크 플로우에서

당신은 CertUI 대화에 대화 파일 속성에서 전환 할 수 있습니다. CertUI (아마)는 leaf/end-entity 인증서 만보고 cert chain 자체를 만듭니다. 그래서 그 시점에서 서명 된 파일에 무엇이 있었는지에 대해서는 약간 부정적입니다.

당신은 파일에 포함 된 인증서 정보를 모두 읽어 약간 더 하나의 호출에서 얻을 수 있습니다. 로컬 테스트에서는 EE 인증서 (서명해야 함)와 중간 CA (서명 라인 없음)를 작성했지만 루트 인증서는 작성하지 않았 음을 보여줍니다 (일반적으로 전송시 루트 인증서를 생략하기 때문에 ...) 그것은 그것을 신뢰하지 않을 것입니다, 그래서 그것은 낭비 된 바이트입니다).

var coll = new X509Certificate2Collection(); 
coll.Import("signedfile.exe"); 
// My coll had 2 certs at this point. 

그래서 당신은 중간체를 해결하는 도움을 필요로하는 경우에 X509Chain.ChainPolicy.ExtraStore에 그 모든 인증서를 전달할 수 있지만, 여전히 체인을 구축 할 필요가 원인을 알 수 있습니다.

using (X509Certificate2 cert = new X509Certificate2("signedfile.exe")) 
{ 
    X509Chain chain = new X509Chain(); 
    chain.ChainPolicy.VerificationFlags = X509VerificationFlags.IgnoreNotTimeValid; 

    bool validChain = chain.Build(cert); 

    if (!validChain) 
    { 
     // Whatever you want to do about that. 

     foreach (var status in chain.ChainStatus) 
     { 
      // In reality you can == this, since X509Chain.ChainStatus builds 
      // an object per flag, but since it's [Flags] let's play it safe. 
      if ((status.Status & X509ChainStatusFlags.PartialChain) != 0) 
      { 
       // Incomplete chain. 
      } 
     } 
    } 

    X509Certificate2Collection chainCerts = new X509Certificate2Collection(); 

    foreach (var element in chain.ChainElements) 
    { 
     chainCerts.Add(element.Certificate); 
    } 

    // now chainCerts has the whole chain in order. 
} 
+0

그냥이 대답을 보았다. .. 내가 이것에 대한 대답을 필요로했던 시대는지나 갔다. 그러나 호기심에서 다음 주에 이것을 시험해 보게한다. – MrPiao