2013-08-17 7 views
16

Ho preparato un'applicazione e un sito Web in cui il cliente può impostare diverse opzioni per questa applicazione prima di scaricarla. Le impostazioni sono archiviate in formato binario alla fine del file (aggiunto), quindi il file modificato viene inviato all'utente finale. Il problema è che la modifica dei "contenuti" del file interromperà la firma del file: esiste la possibilità di firmare nuovamente questo file modificato con qualsiasi strumento della riga di comando? Ho provato a utilizzare il SignTool di Microsoft, ma non funziona correttamente su Linux.Firma un'applicazione Windows su distribuzioni basate su Linux

risposta

15

In realtà è quite straight forward da utilizzare con il segnaposto di Mono; la parte difficile (descritta in modo più dettagliato nell'articolo di Mozilla collegato) sta copiando il certificato nel formato corretto da Windows a Linux.

Conversione del file di certificato PFX di Windows in file PVK e SPC, è necessario eseguire una sola volta quando si copia il certificato da Windows a Linux;

openssl pkcs12 -in authenticode.pfx -nocerts -nodes -out key.pem 
openssl rsa -in key.pem -outform PVK -pvk-strong -out authenticode.pvk 
openssl pkcs12 -in authenticode.pfx -nokeys -nodes -out cert.pem 
openssl crl2pkcs7 -nocrl -certfile cert.pem -outform DER -out authenticode.spc 

In realtà la firma dell'exe è diretta;

signcode \ 
-spc authenticode.spc \ 
-v authenticode.pvk \ 
-a sha1 -$ commercial \ 
-n My\ Application \ 
-i http://www.example.com/ \ 
-t http://timestamp.verisign.com/scripts/timstamp.dll \ 
-tr 10 \ 
MyApp.exe 
+0

Hai avuto un'esperienza personale con l'utilizzo di questo strumento? L'articolo a cui ti riferisci è [oltre 2 anni] (https://developer.mozilla.org/en-US/docs/Signing_an_executable_with_Authenticode$history), quindi una certa sicurezza che sia ancora aggiornato sarebbe bello . –

+0

@RobW Ho firmato gli eseguibili usando quel comando usando Mono 3.2.5 e funziona bene (in effetti ho appena testato). Non riesco a verificare i passaggi esatti per l'esportazione del certificato da Windows in questo momento, dal momento che non sono su un Mac, ma so che il flusso dato è molto simile a quello che ho usato di recente. –

+0

Grazie per la conferma! Non preoccuparti per i certificati, OpenSSL è in grado di convertire qualsiasi cosa in qualcosa. –

15

Si può provare osslsigncode

a firmare un file EXE o file MSI ora si può fare:

osslsigncode sign -certs <cert-file> -key <der-key-file> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -in yourapp.exe -out yourapp-signed.exe 

o se si utilizza un PEM o file di chiave PVK con un password insieme con un certificato PEM:

osslsigncode sign -certs <cert-file> \ 
     -key <key-file> -pass <key-password> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -in yourapp.exe -out yourapp-signed.exe 

o se si desidera aggiungere un timestamp così:

osslsigncode sign -certs <cert-file> -key <key-file> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -t http://timestamp.verisign.com/scripts/timstamp.dll \ 
     -in yourapp.exe -out yourapp-signed.exe 

È possibile utilizzare un certificato e una chiave memorizzata in un file PKCS # 12 contenitore:

osslsigncode sign -pkcs12 <pkcs12-file> -pass <pkcs12-password> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -in yourapp.exe -out yourapp-signed.exe 

Per firmare un file CAB contenente file di classe java:

osslsigncode sign -certs <cert-file> -key <key-file> \ 
     -n "Your Application" -i http://www.yourwebsite.com/ \ 
     -jp low \ 
     -in yourapp.cab -out yourapp-signed.cab 
+0

Questa è la soluzione che ha funzionato per me. Lo strumento signcode non ha firmato il file (anche se ha segnalato che la firma è andata a buon fine) – treaz

+0

Sarà utile per firmare i miei programmi di installazione di Windows (avvolgimento di software Java) creati con Mageia Linux con NSIS e Ant. Grazie mille :) – gouessej

+0

Sono contento di aver trovato questa grande soluzione! In realtà volevo usare qualcos'altro che il file signtool.exe di Microsoft in Windows per firmare il mio codice, quindi ho usato Bash su Ubuntu su Windows dopo aver letto la tua risposta. Se qualcun altro si trova sulla stessa barca, ecco il resoconto https://blog.synapp.nz/2017/06/16/code-signing-a-windows-application-on-linux-on-windows/ –

Problemi correlati