如何使用带有密码保护的密钥文件(pfx)的StrongNameKeyPair?

5

我正在尝试使用密码保护的密钥文件(pfx)程序化地签名程序集。然而,当我尝试使用StrongNameKeyPair时,我遇到了以下异常。

无法获取StrongNameKeyPair的公钥。 在System.Reflection.StrongNameKeyPair.ComputePublicKey()中 在System.Reflection.StrongNameKeyPair.get_PublicKey()中


如果您能展示出导致错误的代码,这将有助于我们(也有助于您)。 - poupou
2个回答

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。


虽然 X509Certificate2Collection 是不必要的(只需使用 X509Certificate2),但这是我找到的最佳解决方案。 - Rafael
@Rafael - 当然。我在回答后看到了这一点 :-) - Simon Mourier

2
这段文字的意思是:微软似乎没有更新StrongNameKeyPair以支持除了snk文件格式之外的任何内容,遗憾的是,没有接受RSA实例的构造函数。事实上,我的理解是,PKCS#12 support for strongnaming assemblies是一种间接的支持方式,即由工具(msbuild或VS.NET)提供,而不是直接由框架提供的。但是,您仍然可以通过重复使用来自Mono.Security StrongName类的(MIT.X11许可证)代码,在任何框架版本和任何(未来)被推广的格式上进行编程签名。它需要更多的工作,但它将适用于任何框架版本和任何(未来)被推广的格式。

StrongNameKeyPair有一个带有byte[]输入的构造函数。我相信从PFX构建它就足够了(参见我的答案)。 - Simon Mourier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接