I certificati thawte dovrebbero essere del tutto identici a quelli prodotti da openssl che ho usato nei miei test, quindi dovrebbero produrre risultati analoghi (cambieranno le informazioni interne, ma si tratta pur sempre di certificati x.509 racchiusi in un file pkcs#12, con estensione .p12 - l'unico tipo che TB consente di importare). Il problema casomai è che, non essendo scritti su una smartcard, non sono utilizzabili per produrre un p7m firmato, ma solo per cifrare un file già esistente (oppure cifrare/firmare interi messaggi direttamente attraverso tb).
@guia78Qui ho trovato una guida su come utilizzare le applicazioni di postecom per creare un archivio di backup dei certificati, ma non sono sicuro che estraggano anche la chiave privata, nè che siano nel formato previsto dal pkcs#12. Se riesci a far vedere la card a tb, allora tutto diventa più semplice: basta importare i certificati tra i certificati personali, quindi farne un backup sul disco (ma anche stavolta non sono sicuro che la smartcard lasci importare l'intero certificato o solo la parte pubblica). Una volta creato il backup, la chiave pubblica (da distribuire all'occorrenza) si può estrarre tramite openssl con questo comando:
openssl pkcs12 -in nome_del_backup_a_piacere.p12 -nokeys | openssl pkcs12 -export -out nome_certificato_pubblico_a_piacere.p12
[opzionalmente aggiungi -name nome_a_piacere ----- serve a richiamare facilmente un certificato specifico: un p12 può essere un keystore e contenere più coppie di chiavi, cui si accede o tramite l'indice, oppure tramite il friendly name]
Se il pipelining da problemi, si può scindere in due comandi:
openssl pkcs12 -in nome_del_backup_a_piacere.p12 -out temp.pem -nokeys
openssl pkcs12 -export -in temp.pem -out nome_cert_pubblico_a_piacere.p12
Può essere necessario indicare la cartella di openssl con i binari (io ho aggiunto il path alle variabili d'ambiente). Se da errore, probabilmente vuol dire che il backup non contiene la chiave privata, quindi è già un certificato pronto per essere distribuito (ma per firmare bisogna sempre accedere alla smartcard).
@kladesSe hai già ricevuto le altre email, allora hai già tutto, l'unica differenza è che nel messaggio prodotto direttamente da tb non ci sono altre parti: ho creato i p7m firmati e cifrati sempre in questo modo, partendo da un messaggio cifrato e firmato di tb, scaricando il p7m e rispedendolo come allegato, quindi, per ricostruire il messaggio originario basta togliere tutto ciò che si trova tra il subject e il content type del p7m, aggiungendo "x-" prima di "pkcs7-mime", es:
Subject: Prova post dike ecc.
[parte da togliere, compreso il buondary dell'allegato]
Content-Type: application/x-pkcs7-mime; name=smime.p7m
Content-Transfer-encoding: base64
Content-Disposition:inline; filename=smime.p7m
[tutto il resto]
Ovviamente cambia anche l'indirizzo del destinatario, ma non credo faccia molta differenza. Senza la chiave privata, in ogni caso, non puoi decifrarlo, e inoltre non posso spedirti, con tb, un messaggio cifrato indirizzato a te se non possiedo un tuo certificato con la chiave pubblica: dovrei spedirti o solo l'allegato p7m, oppure l'intera email come allegato eml, quindi, in ogni caso, non potresti fare prove sul ricevimento di un messaggio cifrato. Altra cosa: come accennavo, questo è il modo in cui tb produce messaggi cifrati; altri client creano la struttura multipart attorno all'allegato, cioè aggiungono dopo il subject:
Content-Type: multipart/mixed;
boundary="------------000208070808050800020406"
[eventuali altri header, ad esempio prodotti da un antivirus]
This is a multipart message in mime format.
[manca il primo boundary di tipo text/plane con il messaggio in chiaro, ovviamente]
------------000208070808050800020406
Content-Type: application/x-pkcs7-mime; name=smime.p7m
[oppure Content-Type: application/pkcs7-mime; name= smime.p7m]
[tutto il resto, cioè il file p7m convertito in base64]
Ho fatto qualche prova con openssl per produrre degli smime firmati (credo di aver pasticciato un po' con i certificati, ma per questa parte è irrilevante, influirebbe solo sulla verifica, che con un qualsiasi programma delle pa fallirebbe a prescindere, visto che non sono una CA ufficiale).
I file firmati prodotti sono di 3 tipi:
- SMIME, che contiene testo in chiaro, e può essere di due tipi:
--- un messaggio MIME che inizia con:
MIME Version: 1.0
Content-type: multipart/signed; protocol:protocol="application/x-pkcs7-signature"; micalg=sha1; boundary="----61E2544A821BEAFB7B538E65BA43B4CE"
e continua con la sezione con il messaggio/l'allegato (processa qualsiasi file come contenente testo, e questo può creare problemi, quindi conviene crearlo come binario e del tipo successivo) e la firma (application/x-pkcs7-signature). Sarebbe facile da distinguere: basterebbe decodificare le prime righe in base64 nel messaggio "esterno" (che contiene l'allegato firmato e lo codifica in base64) e cercare la stringa "Content-Type"; tuttavia, sembra che dike non riconosca questo tipo di smime come una "busta pkcs7" (che però è tutt'altra cosa, quindi l'implementazione all'italiana ha fatto confusione anche qui);
--- un pkcs7 con firma incorporata: si ha un file in chiaro (che nell'email diverrà comunque un allegato con transfer encoding base64 - però non ho ancora verificato, ma credo proprio funzioni così), senza struttura multipart, ma solo con l'header del p7m "interno" (che conterrà il file e la firma a loro volta codificati in base64); anche stavolta si potrebbe procedere cercando la stringa "Content-Type", ma anche stavolta non piace a dike (non solo non trova e non verifica la firma, ma non riconosce e non estrae l'allegato/il testo del messaggio);
- come una struttura PEM: sono file di testo, che contengono il messaggio/il file più la firma codificati come base64 e delimitati dalle stringhe: ----------BEGIN PKCS7----- e -----END PKCS7----- come da rfc2315 (come formato generico di un pkcs7, ma l'rfc2311 relativo a smime consente i casi precedenti); in questo caso dike vede l'allegato, e lo estrae correttamente, sia che ci siano i delimitatori, sia che non ci siano affatto: in questo caso si potrebbe distinguere un p7m firmato da uno cifrato cercando innanzitutto il delimitatore di inizio pkcs7 (nella prima riga codificata in base64 nel messaggio "esterno"), quindi, se non si trova, verificare che la prima riga, decodificata da base64, contenga ancora una riga contenente i soli caratteri ammessi in base64 (dubito che un file cifrato cominci con i soli caratteri dell'alfabeto più i simboli "+" e "/");
-come un file in formato DER: anche questo viene letto senza problemi da dike; sfortunatamente è binario, quindi difficilmente sarà distinguibile da un p7m cifrato (anche perchè l'rfc2311 prevede diversi tipi di crittografia, e il der varia a seconda del contuenuto); oltretutto l'rfc2311 definisce il der per i pkcs10.
La cosa più semplice (e anche la più ovvia), ma forse la più difficile da fare con una estensione (più che altro per la documentazione mancante o incompleta) sarebbe intercettare l'errore nella gestione di smime da parte di tb e ordinare al client di trattare l'allegato come un generico octet-stream da mostrare all'utente, quindi forzarlo ad elaborare gli allegati successivi.
Probabilmente,
qui c'è la soluzione al dilemma, o meglio, la conferma ai sospetti: nella "feature list" si può notare come le caratteristiche necessarie per il supporto ai pkcs7-mime con firma (in particolare, incorporata) attualmente siano mancanti o implementate parzialmente, in particolare mi riferisco ai punti 2 e 3