如何将StrongNameKeyPair与密码保护密钥文件(pfx)一起使用?
我试图编程使用密码保护密钥文件(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