2011-09-26 41 views
5

Tôi đang cố gắng lập trình ký một assembly bằng cách sử dụng mật khẩu bảo vệ keyfile (pfx). Tuy nhiên khi tôi cố gắng sử dụng StrongNameKeyPair tôi nhận được ngoại lệ sau đây.Làm thế nào để sử dụng StrongNameKeyPair với một mật khẩu bảo vệ keyfile (pfx)?

Không thể lấy khóa công khai cho StrongNameKeyPair. tại System.Reflection.StrongNameKeyPair.ComputePublicKey() tại System.Reflection.StrongNameKeyPair.get_PublicKey()

+0

Nó sẽ giúp chúng tôi (và bạn) nếu bạn cho chúng tôi thấy mã bạn đã sử dụng để nhận được lỗi đó. – poupou

Trả lời

1

Nó không giống như Microsoft cập nhật StrongNameKeyPair để hỗ trợ bất cứ điều gì khác hơn là snk định dạng tập tin - như có, thật đáng buồn , không có hàm tạo nào chấp nhận một cá thể RSA. Trên thực tế, sự hiểu biết của tôi là PKCS # 12 support cho các hội đồng đặt tên mạnh là một phần gián tiếp, tức là được cung cấp bởi các công cụ (msbuild hoặc VS.NET) và không trực tiếp bởi khung công tác.

Tuy nhiên bạn vẫn có thể lập trình ký một assembly bằng cách sử dụng bất kỳ cá thể RSA nào bằng cách sử dụng lại mã (MIT.X11 được cấp phép) từ lớp Mono.Security StrongName, có sẵn trong github. Đó là một chút công việc - nhưng nó sẽ làm việc trên bất kỳ phiên bản khung và bất kỳ (tương lai) định dạng được thăng :-)

+0

StrongNameKeyPair có một hàm tạo với đầu vào byte []. Tôi tin rằng nó đủ để xây dựng nó từ một PFX (xem câu trả lời của tôi). –

3

Đây là một đoạn mã C# tạo đối tượng StrongNameKeyPair từ tệp .PFX được bảo vệ bằng mật khẩu :

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)); 
    } 

LƯU Ý: Tôi cho rằng PFX ở đây đã được tạo bởi công cụ .NET Framework (ví dụ: biểu mẫu giao diện người dùng dạng Visual Studio) để hỗ trợ tạo tên mạnh. Có thể không ổn với bất kỳ PFX nào.

+0

Mặc dù X509Certificate2Collection là không cần thiết (chỉ cần sử dụng X509Certificate2) đây là giải pháp tốt nhất mà tôi đã tìm thấy. – Rafael

+0

@Rafael - Tuyệt đối. Tôi thấy rằng sau khi câu trả lời :-) –

Các vấn đề liên quan