2011-09-26 124 views
5

我試圖編程使用密碼保護密鑰文件(pfx)簽署程序集。但是,當我嘗試使用StrongNameKeyPair時,出現以下異常。如何將StrongNameKeyPair與密碼保護密鑰文件(pfx)一起使用?

無法獲取StrongNameKeyPair的公鑰。 在System.Reflection.StrongNameKeyPair.ComputePublicKey() 在System.Reflection.StrongNameKeyPair.get_PublicKey()

+0

如果您向我們展示了用於獲取該錯誤的代碼,它將幫助我們(和您)。 – poupou

回答

1

它看起來並不像微軟更新StrongNameKeyPair支持比SNK文件格式以外的任何 - 爲有,可悲,沒有接受RSA實例的構造函數。

事實上,我的理解是,強制執行程序集的PKCS#12 support是間接的,即由工具(msbuild或VS.NET)提供,而不是直接由框架提供。

但是,仍然可以通過重新使用來自Mono.Security StrongName類的(MIT.X11許可的)代碼(可在github中獲得)使用任何RSA實例編程簽名程序集。這是一個更多的工作 - 但它將適用於任何框架版本和任何(未來)格式得到提升:-)

+0

StrongNameKeyPair有一個帶有byte []輸入的構造函數。我相信它足以從PFX構建它(請參閱我的答案)。 –

3

這是一塊C#代碼,從密碼保護的.PFX文件創建一個StrongNameKeyPair對象:

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

注:我假設PFX這裏已經由.NET Framework工具創建(例如Visual Studio的強名稱UI形式),以支持一個強大的組合創建名稱。它可能不適用於任何PFX。

+0

儘管X509Certificate2Collection是不必要的(只需使用X509Certificate2),但這是我找到的最佳解決方案。 – Rafael

+0

@Rafael - 當然。我看到答案後:-) –