Come gestire la mia chiave privata per la firma di assembly .NET?

4

Scrivo le librerie di classi .NET open source come un hobby e ho pensato di firmarle. Posso ottenere Visual Studio per generare una coppia di chiavi pubblica / privata protetta da password e salvarla come file .pfx, ma non penso che dovrei farlo per il progetto ogni singolo . Una coppia di chiavi dovrebbe essere sufficiente, giusto?

Ovviamente non inserirò il mio file .pfx con il codice sorgente nel mio repository pubblico online: solo gli assembly che rilascio dovrebbero essere firmati con la mia coppia di chiavi. Altre persone possono utilizzare le proprie chiavi se lo desiderano.

Quindi mi rimane un file .pfx che presumibilmente contiene la mia coppia di chiavi pubblica / privata.

  • Come gestisco la mia coppia di chiavi in modo efficace?
  • Dove lo memorizzo?
  • Devo importarlo da qualche parte?
  • Come posso usarlo sia sul mio PC che sul mio laptop?
  • Come faccio a impedire che la coppia di chiavi diavolo quando passi da PC a laptop?
posta Daniel Pelsmaeker 18.03.2013 - 12:40
fonte

2 risposte

6

Il metodo di memorizzazione della coppia di chiavi dipende molto da quanto male si desidera proteggerlo da un uso indesiderato. Personalmente, memorizzo le mie chiavi in una cartella protetta dagli ACL standard (quindi chiunque riesca a ottenere l'accesso amministrativo alla mia macchina può accedere alle mie coppie di chiavi). Per me è abbastanza buono dato che le mie coppie di chiavi non sono così preziose. Microsoft consiglia di utilizzare un contenitore chiave .

Se si vuole evitare di dover sincronizzare le coppie di chiavi tra macchine, allora probabilmente è meglio se si costruisse la versione di rilascio delle librerie su una singola macchina (o sul PC o sul portatile) e si facesse quella macchina ' costruire la macchina '. In tal caso, a seconda di dove stai memorizzando la tua coppia di chiavi (in un file protetto da ACL o in un contenitore di chiavi) puoi utilizzare una di queste tecniche:

Se mantieni la coppia di chiavi in un file :

  1. Crea coppie di chiavi pubbliche / private per entrambi i computer. Puoi copiare la coppia di chiavi ma non è necessario, la generazione di singoli per ogni macchina è ugualmente valida.
  2. Su ogni macchina crea una variabile di ambiente che punta alla posizione della coppia di chiavi su quella macchina specifica. Assicurati che le variabili di ambiente abbiano lo stesso nome su entrambe le macchine.
  3. Per consentire di condividere il codice tra le macchine e utilizzare ancora i file chiave specifici della macchina, aggiungi la seguente sezione al tuo file di progetto C #.

    <PropertyGroup>
        <SignAssembly>true</SignAssembly>
        <DelaySign>false</DelaySign>
        <AssemblyOriginatorKeyFile>$(YOUR_ENVIRONMENT_VARIABLE_HERE)</AssemblyOriginatorKeyFile>
    </PropertyGroup>
    

Se vuoi che la chiave venga visualizzata nella sezione "proprietà" del progetto, puoi aggiungere la seguente sezione

<None Include="$(YOUR_ENVIRONMENT_VARIABLE_HERE)">
  <Link>Properties\App.snk</Link>
</None>

Se mantieni la coppia di chiavi in un contenitore di chiavi :

  1. Crea coppie di chiavi pubbliche / private per entrambi i computer e memorizzale nei contenitori delle chiavi. Assicurati di utilizzare lo stesso nome per il contenitore di chiavi.
  2. Per consentire di condividere il codice tra le macchine e utilizzare ancora i file chiave specifici della macchina, aggiungi la seguente sezione al tuo file di progetto C #.

    <PropertyGroup>
        <SignAssembly>true</SignAssembly>
        <DelaySign>false</DelaySign>
        <KeyContainerName>YOUR_CONTAINER_NAME_HERE</KeyContainerName>
    </PropertyGroup>
    

In questo caso non sono sicuro di poter collegare la chiave dalla sezione "proprietà" (non sospetto).

L'utilizzo di uno di questi modi consente a MsBuild di trovare la chiave e usarla durante la compilazione, pur continuando a offrirti un modo (semi) portatile di gestire chiavi diverse su macchine diverse. Assicurati di creare sempre la versione di rilascio delle librerie sulla stessa macchina (che avrà un solo set di chiavi), altrimenti le versioni verranno rilasciate con chiavi diverse.

Per quanto riguarda l'inferno delle coppie di chiavi, l'unica cosa che non puoi fare è spostare le cartelle bin da una macchina all'altra e aspettarti che le build parziali funzionino. Se ricostruisci le librerie, non dovrebbero esserci problemi.

    
risposta data 18.03.2013 - 21:05
fonte
1

Ecco come viene gestita da un certo grande software open source, che richiede che tutto sia nel loro controllo di origine ed esegua lo stack di CI, mantenendo allo stesso tempo la sicurezza di questi documenti di firma.

Il trucco è che il codice sorgente risiede in un repository pubblico mentre le chiavi risiedono in un diverso repository SVN privato. Il servizio di creazione ha le credenziali per accedere e scaricare le chiavi da SVN su HTTP e lo farà come parte della build finale.

L'altra tattica di successo è generare una coppia di chiavi per ogni progetto e lasciarlo viaggiare con il codice. Dato che la chiave è solo per quel progetto, non stai rischiando la privacy. E poiché la chiave è la sicurezza ben nota generalmente funziona.

    
risposta data 18.03.2013 - 21:07
fonte

Leggi altre domande sui tag