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

时间:2011-09-26 14:41:36

标签: .net code-signing strongname pkcs#12 assembly-signing

我正在尝试使用受密码保护的密钥文件(pfx)以编程方式对程序集进行签名。但是当我尝试使用StrongNameKeyPair时,我得到以下异常。

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

2 个答案:

答案 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许可)代码。这是一个更多的工作 - 但它将适用于任何框架版本和任何(未来)格式得到提升: - )