2011-09-26 26 views
5

パスワードで保護されたキーファイル(pfx)を使用してアセンブリにプログラムで署名しようとしています。しかし、StrongNameKeyPairを使用しようとすると、次の例外が発生します。パスワードで保護されたキーファイル(pfx)でStrongNameKeyPairを使用するにはどうすればよいですか?

StrongNameKeyPairの公開鍵を取得できません。 System.Reflection.StrongNameKeyPair.get_PublicKeyでSystem.Reflection.StrongNameKeyPair.ComputePublicKeyで () ()

+0

エラーを取得するために使用したコードを表示すると、それが役立つでしょう。 – poupou

答えて

1

これは、MicrosoftがSNKファイル形式以外のものをサポートするために、StrongNameKeyPairを更新似ていない - 悲しいことに、ありますようRSAインスタンスを受け入れるコンストラクタはありません。

実際に私の理解では、強力な名前付けアセンブリ用のPKCS#12 supportは間接的なものです。すなわち、フレームワークによって直接ではなく、ツール(msbuildまたはVS.NET)によって提供されます。

しかし、githubで利用可能なMono.Security StrongNameクラスの(MIT.X11ライセンスの)コードを再利用することで、任意のRSAインスタンスを使用してアセンブリにプログラム的に署名することができます。これはもう少し作業ですが、それはどんなフレームワークのバージョンや将来(将来)のフォーマットでも動作します:-)

+0

StrongNameKeyPairには、byte []入力を持つコンストラクタがあります。私はそれがPFXから構築するのに十分だと考えています(私の答えを見てください)。 –

3

パスワードで保護された.PFXファイルからStrongNameKeyPairオブジェクトを作成するC#コードです:

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)); 
    } 

注:私は、アセンブリに厳密な名前の作成をサポートするために、ここで(例えばVisual Studioの厳密な名前のUIフォーム).NET Frameworkのツールで作成されたPFXを前提としています。どのPFXでもOKではないかもしれません。

+0

X509Certificate2Collectionは必要ですが(X509Certificate2を使用してください)、これは私が見つけた最良の解決策です。 – Rafael

+0

@Rafael - 絶対に。私は答えの後にそれを見た:-) –

関連する問題