2011-09-26 1 views
5

암호로 보호 된 키 파일 (pfx)을 사용하여 프로그래밍 방식으로 어셈블리에 서명하려고합니다. 그러나 StrongNameKeyPair를 사용하려고하면 다음과 같은 예외가 발생합니다.StrongNameKeyPair를 암호로 보호 된 키 파일 (pfx)과 함께 사용하는 방법은 무엇입니까?

StrongNameKeyPair에 대한 공개 키를 가져올 수 없습니다. System.Reflection.StrongNameKeyPair.get_PublicKey()에서 System.Reflection.StrongNameKeyPair.ComputePublicKey() 에서

+0

오류가 발생했을 때 사용한 코드를 표시하면 도움이됩니다. – poupou

답변

1

마이크로 소프트가 SNK 파일 형식 이외의 지원 StrongNameKeyPair 업데이트처럼은 보이지 않는다 - 거기로 슬프게도, RSA 인스턴스를 받아들이는 생성자가 없습니다.

사실 강경 어셈블리에 대한 PKCS # 12 support은 간접적 인 것으로, 즉 프레임 워크가 직접 제공하지 않는 도구 (msbuild 또는 VS.NET)에 의해 제공됩니다.

그러나 github에서 사용할 수있는 Mono.Security StrongName 클래스의 (MIT.X11 라이센스가 부여 된) 코드를 다시 사용하여 RSA 인스턴스를 사용하여 어셈블리에 프로그래밍 방식으로 서명 할 수 있습니다. 조금 더 많은 작업이 이루어 지지만 어떤 프레임 워크 버전이나 향후 (향후) 형식에서도 작동 할 것입니다 :-)

+0

StrongNameKeyPair에는 byte [] 입력이있는 생성자가 있습니다. PFX에서 구축하는 것으로 충분하다고 생각합니다 (제 대답 참조). –

3

다음은 암호로 보호 된 .PFX 파일에서 StrongNameKeyPair 개체를 만드는 C# 코드입니다. :

public static StrongNameKeyPair GetStrongNameKeyPairFromPfx(string pfxFile, string password) 
    { 
     X509Certificate2Collection certs = new X509Certificate2Collection(); 
     certs.Import(pfxFile, password, X509KeyStorageFlags.Exportable); 
     if (certs.Count == 0) 
      throw new ArgumentException(null, "pfxFile"); 

     RSACryptoServiceProvider provider = certs[0].PrivateKey as RSACryptoServiceProvider; 
     if (provider == null) // not a good pfx file 
      throw new ArgumentException(null, "pfxFile"); 

     return new StrongNameKeyPair(provider.ExportCspBlob(false)); 
    } 

참고 : 나는 어셈블리의 강력한 이름 생성을 지원하기 위해 여기에 (예를 들어, 비주얼 스튜디오 강력한 이름의 UI 양식)의 .NET Framework 도구에 의해 생성 된 PFX를 가정합니다. 어떤 PFX에서도 괜찮은 것은 아닙니다.

+0

X509Certificate2Collection이 필요하지만 (X509Certificate2 만 사용하십시오.) 이것이 내가 찾은 최고의 솔루션입니다. – Rafael

+0

@Rafael - 물론입니다. 그 대답을 본 후 :-) –

관련 문제