java keytool - come modificare le informazioni su proprietario ed emittente di un keystore?

0

Ho un prodotto che inizialmente utilizzava un keystore in cui il certificato come proprietario e l'informazione dell'emittente erano "sconosciuti".

Ora, per ragioni di sicurezza e comunque a garanzia di compatibilità con la versione posteriore, devo aggiornare le informazioni su proprietario ed emittente mantenendo la coppia di chiavi pubblica / privata originale (per compatibilità retroattiva).

È possibile fare una cosa del genere?

    
posta Melo 11.01.2017 - 20:21
fonte

1 risposta

1

TLDR: non è possibile modificare un certificato; puoi e dovresti sostituirlo .

Non è possibile modificare nulla all'interno di un certificato perché è firmato digitalmente per impedire a chiunque di modificare qualsiasi cosa al suo interno. Tuttavia, puoi ottenere un nuovo certificato per la stessa coppia di chiavi, ma con nuove date, nomi diversi e forse altre modifiche.

Nessuna CA reale emette un certificato con il proprietario (che in realtà è Soggetto) o l'emittente che contiene solo 'sconosciuto', molto meno entrambi, quindi questo è quasi certamente il certificato autofirmato fittizio (segnaposto) creato da keytool quando genera una coppia di chiavi.

Se vuoi ottenere un certificato "vero" da un'autorità di certificazione affidabile e affidabile, ovvero CA, puoi farlo con keytool ; infatti questo è il processo normale :

  1. keytool -genkeypair : crea keypair e cert auto (nel keystore)
  2. keytool -certreq : crea Cert Signing Request aka CSR (per keypair in keystore)
  3. invia CSR a CA insieme a prove di identità (spesso, in particolare per server SSL / TLS, un nome di dominio Internet, ma a volte un altro tipo di identità) e, se applicabile, il pagamento
  4. riceve / recupera un nuovo certificato dalla CA insieme a tutti i certificati "catena" o "intermedia"
  5. keytool -importcert : installa il nuovo certificato e catena nel keystore

Vedi il manuale Java ad es. link . I dettagli dei passaggi 3 e 4 variano a seconda della CA che utilizzi e tutte le CA che ho mai visto hanno istruzioni personalizzate per l'emissione di un certificato in un sistema Java, spesso elencate in Tomcat come sistema Java "tipico", adattato a tale CIRCA. Hai effettivamente eseguito il passaggio 1 ma con il nome soggetto errato e devi completare i passaggi rimanenti con una variante:

  • nel passaggio 2 keytool -certreq aggiungi l'opzione -dname 'newnamefields' (usa " su Windows) per specificare il richiedente / il nome soggetto corretto per il CSR.

Informazioni generali sui nomi dei certificati si trovano nella stessa pagina alla voce X.500 nomi distinti . Se questa cert (e chiave) sarà per un server SSL / TLS, il nome soggetto dovrebbe essere o includere 'CN=servername' dove servername non è il nome di una persona come descritto nel manuale, ma invece il nome, o un carattere jolly (solo nel primo componente) che corrisponde al nome, del server quando è accessibile dai client . Per i server pubblici / Internet, di solito è un nome di dominio completo (FQDN) o in alcuni casi un indirizzo IP, ma alcuni ambienti Intranet o LAN utilizzano altri nomi.

Altrimenti: se vuoi creare un nuovo certificato autofirmato, keytool non ha un'opzione per quello; puoi scrivere un programma per farlo, ma è più facile, anche se un po 'rotondeggiante, utilizzare OpenSSL . È inoltre possibile utilizzare OpenSSL per richiedere un certificato CA reale con alcune opzioni che keytool non supporta. Se sei su Linux probabilmente hai già OpenSSL; su altri Unix potrebbe essere necessario installarlo, quasi sempre dal normale repository / canale / etc del venditore; su Windows (a meno che Windows 10 con WSL) è necessario installare il pacchetto ShiningLight . Di profilo questo è:

  1. keytool -importkeystore -srckeystore jksfile -destkeystore tempp12 -deststoretype pkcs12 # convert from Java-only JKS to standardized PKCS12

  2. openssl pkcs12 -in tempp12 -nocerts -out tempkey # convert from PKCS12 to OpenSSL's 'private' PEM format

  3. per autofirmato: openssl req -new -x509 -inkey tempkey -validity days -out newcert e prompt di risposta per il nome (oppure specificare -subj 'namefields' ); vedi man req su Unix per i dettagli, o sul web o versione precedente se applicabile . Quindi keytool -importcert -file newcert -keystore jksfile [-alias entry_if_not_mykey]

  4. Per firma CA: modificare il file di configurazione OpenSSL (o una copia) se necessario, quindi openssl req -new [-config conffile] -inkey tempkey [-subj 'namefields'] -out csrfile , quindi inviare questo CSR a una CA nello stesso modo utilizzato per Java sopra. Quando ottieni un nuovo certificato e la sua catena, fai uno di quanto segue:

    4a. keytool -importcert dei certificati di catena necessari a una voce diversa o a voci diverse singolarmente dall'alto verso il basso, quindi il certificato EE alla stessa voce, come descritto per Java

    4b. combinare il certificato EE e i relativi certificati di catena, tutti in PEM, in un singolo file e keytool -importcert l'intera catena alla stessa voce

    4c. usa openssl pkcs12 -export per combinare tempkey più il (nuovo) certificato e catena in un singolo file diciamo newp12 , per man pkcs12 o qui o prima , quindi keytool -importkeystore -srckeystore newp12 -srcstoretype pkcs12 -destkeystore jksfile dopo aver eliminato la vecchia voce, o semplicemente cancellando il file se questa è solo la voce (desiderata)

risposta data 12.01.2017 - 19:00
fonte

Leggi altre domande sui tag