2011-09-26 9 views
5

Sto provando a firmare programmaticamente un assembly utilizzando un file di chiavi protetto da password (pfx). Tuttavia quando provo ad usare StrongNameKeyPair ottengo la seguente eccezione.Come usare StrongNameKeyPair con un keyfile protetto da password (pfx)?

Impossibile ottenere la chiave pubblica per StrongNameKeyPair. a System.Reflection.StrongNameKeyPair.ComputePublicKey() a System.Reflection.StrongNameKeyPair.get_PublicKey()

+0

Ci aiuterebbe (e tu) se ci mostrassi il codice che hai usato per ottenere quell'errore. – poupou

risposta

1

Non sembra come Microsoft ha aggiornato StrongNameKeyPair per sostenere qualcosa di diverso dal SNK formato di di file - come non c'è, purtroppo , nessun costruttore accetta un'istanza RSA.

Infatti, la mia comprensione è che il PKCS # 12 support per gli assembly strongnaming è uno indiretto, cioè fornito dagli strumenti (msbuild o VS.NET) e non direttamente dal framework.

Tuttavia è ancora possibile firmare programmaticamente un assembly utilizzando qualsiasi istanza RSA riutilizzando il codice (concesso in licenza da MIT.X11) dalla classe Mono.Security StrongName, disponibile in github. È un po 'più di lavoro - ma funzionerà su qualsiasi versione di framework e qualsiasi (futuro) formato che venga promosso :-)

+0

StrongNameKeyPair ha un costruttore con un input di byte []. Credo che basterà costruirlo da un PFX (vedi la mia risposta). –

3

Ecco un pezzo di codice C# che crea un oggetto StrongNameKeyPair da un file .PFX protetto da password :

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

NOTA: Suppongo che il PFX qui è stato creato dagli strumenti di .NET Framework (ad esempio lo Studio nome sicuro modulo di interfaccia utente visiva) per supportare una creazione nome di assembly. Potrebbe non essere ok con qualsiasi PFX.

+0

Sebbene X509Certificate2Collection sia necessario (basta usare X509Certificate2) questa è la soluzione migliore che ho trovato. – Rafael

+0

@ Rafael - Assolutamente. L'ho visto dopo la risposta :-) –

Problemi correlati