Come importare un nuovo certificato CA Java senza utilizzare l'utilità della riga di comando keytool?

StackOverflow https://stackoverflow.com/questions/1650596

  •  22-07-2019
  •  | 
  •  

Domanda

Riepilogo: come posso installare un nuovo certificato radice in Java usando il codice Java?

Abbiamo un'applicazione desktop che accede a vari servizi web. Recentemente uno di loro ha cambiato il proprio certificato SSL con uno firmato da Trustwave. Mentre i certificati SSL Trustwave sono accettati dai normali browser Internet, Java non sembra avere i certificati radice prerequisiti e abbiamo perso l'accesso al servizio Web fornito con il seguente messaggio di errore:

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Abbiamo ottenuto un recupero temporaneo convincendo il fornitore a tornare a Verisign ma quando tornano indietro dobbiamo essere pronti. Quindi ho bisogno del nostro software desktop per installare automaticamente il certificato radice Trustwave secondo necessità. I nostri clienti non sono abbastanza esperti di tecnologia da utilizzare il comando keytool e preferirei non scriverlo poiché questo mi sembra una soluzione fragile (implementazioni separate per Mac e PC, la lotta contro le restrizioni di esecuzione di Vista, difficoltà a trovare il JRE corretto da installare in , ecc.)

Immagino che il keytool usi Java internamente. Quale comando potrei usare all'interno di Java per replicare la funzionalità di keytool e installare il certificato root a livello di codice?

È stato utile?

Soluzione

Non so se sia possibile, ma potresti implementare il tuo TrustManager per consentire questa connessione o questa CA. Qui sono le basi.

Altri suggerimenti

IMHO, Sun non ha esposto il keytool tramite un'API, principalmente per impedire agli sviluppatori di modificare il set di CA affidabili. Posso davvero immaginare che gli aggressori che sfruttano tale codice per inserire i propri certificati di root nel truststore compromettano il modello stesso del truststore.

In effetti, se si osserva l'origine della classe KeyTool (pacchetto sun.security.tools), non solo è definitivo, ma ha anche un costruttore privato che impedisce a qualsiasi chiamante di creare un'istanza della classe KeyTool dal codice . KeyTool ha un metodo principale, rendendo la riga di comando (e quindi un utente del sistema operativo) forse l'unico modo in cui si può inizializzare e comunicare con KeyTool.

Gli unici approcci (semplicistici) rimasti sarebbero:

  • Inizializza keytool come processo dall'applicazione e passa gli argomenti della riga di comando per installare il certificato CA radice. Questa da sola è una cattiva idea e consiglierei di informare l'utente su ciò che sta accadendo.
  • Evita l'uso di keytool e fornisci invece agli utenti istruzioni su come installare la CA principale usando Keyman o IUI KeyTool . Parlando da solo solo qui, preferisco quest'ultimo.

Potresti sempre invocare KeyTool come processo Runtime.exec (...) .

Se si desidera installare il certificato sul keystore della radice attendibile sul computer desktop, è necessario disporre dell'autorizzazione per farlo. È lo stesso con il keytool , è necessaria una password per accedere al keystore del root di fiducia. Se vuoi essere quick-n-dirty, puoi

  • scrivi il certificato in un file o in un flusso di byte o altro
  • importa usando la classe KeyTool ( sun.security.tools.KeyTool )

Ma IMHO se il certificato non è valido, non è affidabile. Direi che c'è una buona ragione per questo.

Soluzione da riga di comando. Sul Mac, la home Java è / Libreria / Java / Home. Prova:

$ sudo -i
# cd /Library/Java/Home
# keytool -import -trustcacerts -alias CAName -file CA.crt -keystore lib/security/cacerts

Sostituisci CAName con il nome della tua CA e CA.crt con un percorso al tuo file di certificato (PEM funziona). Richiederà una password del keystore. La password predefinita è indicata nell'articolo collegato.

Ho dovuto farlo per uno dei certificati CA di RapidSSL.

Sun ha pubblicato questo codice per creare una versione aggiornata del file cacerts in base a qualsiasi host di destinazione che esegue https con eventuali certificati:

https://code.google.com/p/java-use-examples/source/browse/trunk/src/com/aw/ad/util/InstallCert.java

I tuoi nuovi cacert saranno chiamati jssecacerts nella directory corrente. Basta copiare quel nuovo file sul tuo file jre / lib / security / cacerts.

Non faccio commenti sulla sicurezza del tuo nuovo file Cacerts.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top