È possibile far sì che Java ignori il "negozio di fiducia" e accetti qualunque certificato SSL ottenga?
-
10-07-2019 - |
Domanda
Sto provando a scrivere un client SSL che invia posta utilizzando l'API javax.mail. Il problema che sto riscontrando è che il server richiede che io utilizzi SSL, ma il server è anche configurato con un certificato SSL non standard. Le pagine Web che ho trovato affermano che devo installare il certificato nel truststore. Non voglio farlo (non ho i permessi necessari.)
- C'è un modo per far sì che Java ignori semplicemente l'errore del certificato e lo accetti?
- In caso contrario, c'è un modo per fare in modo che l'archivio di fiducia sia locale per il mio programma e non sia installato per l'intera JVM?
Soluzione
Devi creare un TrustManager falso che accetta tutti i certificati e registrarlo come gestore. Qualcosa del genere:
public class MyManager implements com.sun.net.ssl.X509TrustManager {
public boolean isClientTrusted(X509Certificate[] chain) { return true; }
public boolean isHostTrusted(X509Certificate[] chain) { return true; }
...
}
com.sun.net.ssl.TrustManager[] managers =
new com.sun.net.ssl.TrustManager[] {new MyManager()};
com.sun.net.ssl.SSLContext.getInstance("SSL").
.init(null, managers, new SecureRandom());
Altri suggerimenti
Codice di lavoro (in jdk1.6.0_23) per # 1.
Le importazioni
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
L'attuale fiducia in tutto il codice TrustManager.
TrustManager trm = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
Prova questo (risposta alla domanda 2):
System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore");
Puoi anche specificare questo come parametro della riga di comando aggiuntivo:
java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments>
Su Fedora potrebbe trattarsi del Trust Store Java a livello di sistema in /etc/pki/java/cacerts
È sufficiente aggiungere -Dtrust_all_cert = true
agli argomenti della VM. Questo argomento dice a java di ignorare tutti i controlli dei certificati.
Nella riga di comando puoi aggiungere l'argomento -noCertificationCheck
a java per ignorare i controlli del certificato.