我正在尝试使用受密码保护的密钥文件(pfx)以编程方式对程序集进行签名。但是当我尝试使用StrongNameKeyPair时,我得到以下异常。
无法获取StrongNameKeyPair的公钥。 在System.Reflection.StrongNameKeyPair.ComputePublicKey() 在System.Reflection.StrongNameKeyPair.get_PublicKey()
答案 0 :(得分: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都可能没问题。
答案 1 :(得分:1)
微软更新StrongNameKeyPair似乎不支持 snk 文件格式以外的任何内容 - 遗憾的是,没有构造函数接受RSA实例。
实际上我的理解是强制组件的PKCS#12 support是间接的,即由工具(msbuild或VS.NET)提供,而不是由框架直接提供。
但是,您仍然可以使用任何RSA实例以编程方式签署程序集,方法是重新使用github中提供的Mono.Security StrongName类的(MIT.X11许可)代码。这是一个更多的工作 - 但它将适用于任何框架版本和任何(未来)格式得到提升: - )