È possibile far sì che Java ignori il "negozio di fiducia" e accetti qualunque certificato SSL ottenga?

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

  •  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.)

  1. C'è un modo per far sì che Java ignori semplicemente l'errore del certificato e lo accetti?
  2. 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?
È stato utile?

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.

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