我試圖編程使用密碼保護密鑰文件(pfx)簽署程序集。但是,當我嘗試使用StrongNameKeyPair時,出現以下異常。如何將StrongNameKeyPair與密碼保護密鑰文件(pfx)一起使用?
無法獲取StrongNameKeyPair的公鑰。 在System.Reflection.StrongNameKeyPair.ComputePublicKey() 在System.Reflection.StrongNameKeyPair.get_PublicKey()
我試圖編程使用密碼保護密鑰文件(pfx)簽署程序集。但是,當我嘗試使用StrongNameKeyPair時,出現以下異常。如何將StrongNameKeyPair與密碼保護密鑰文件(pfx)一起使用?
無法獲取StrongNameKeyPair的公鑰。 在System.Reflection.StrongNameKeyPair.ComputePublicKey() 在System.Reflection.StrongNameKeyPair.get_PublicKey()
它看起來並不像微軟更新StrongNameKeyPair支持比SNK文件格式以外的任何 - 爲有,可悲,沒有接受RSA實例的構造函數。
事實上,我的理解是,強制執行程序集的PKCS#12 support是間接的,即由工具(msbuild或VS.NET)提供,而不是直接由框架提供。
但是,仍然可以通過重新使用來自Mono.Security StrongName類的(MIT.X11許可的)代碼(可在github中獲得)使用任何RSA實例編程簽名程序集。這是一個更多的工作 - 但它將適用於任何框架版本和任何(未來)格式得到提升:-)
StrongNameKeyPair有一個帶有byte []輸入的構造函數。我相信它足以從PFX構建它(請參閱我的答案)。 –
這是一塊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。
儘管X509Certificate2Collection是不必要的(只需使用X509Certificate2),但這是我找到的最佳解決方案。 – Rafael
@Rafael - 當然。我看到答案後:-) –
如果您向我們展示了用於獲取該錯誤的代碼,它將幫助我們(和您)。 – poupou