2011-09-26 55 views
5

我试图编程使用密码保护密钥文件(pfx)签署程序集。但是,当我尝试使用StrongNameKeyPair时,出现以下异常。如何将StrongNameKeyPair与密码保护密钥文件(pfx)一起使用?

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

+0

如果您向我们展示了用于获取该错误的代码,它将帮助我们(和您)。 – poupou

回答

1

它看起来并不像微软更新StrongNameKeyPair支持比SNK文件格式以外的任何 - 为有,可悲,没有接受RSA实例的构造函数。

事实上,我的理解是,强制执行程序集的PKCS#12 support是间接的,即由工具(msbuild或VS.NET)提供,而不是直接由框架提供。

但是,仍然可以通过重新使用来自Mono.Security StrongName类的(MIT.X11许可的)代码(可在github中获得)使用任何RSA实例编程签名程序集。这是一个更多的工作 - 但它将适用于任何框架版本和任何(未来)格式得到提升:-)

+0

StrongNameKeyPair有一个带有byte []输入的构造函数。我相信它足以从PFX构建它(请参阅我的答案)。 –

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。

+0

尽管X509Certificate2Collection是不必要的(只需使用X509Certificate2),但这是我找到的最佳解决方案。 – Rafael

+0

@Rafael - 当然。我看到答案后:-) –