Question

Nous avons une application Java que nous devons ignorer un auto-signé cert, mais nous ne pouvons pas expirés modifier le code pour le faire. Je me demandais s'il y avait une variable d'environnement ou la propriété système que nous pourrions fournir commencer jusqu'à qui nous permettrait d'avoir de tous expiré cert ignoré pour l'instant, ou même être plus précis et de fournir à l'extérieur du cert spécifique que nous aimerions avoir l'expiration ignoré.

Quelqu'un a des idées qui fonctionnerait?

Était-ce utile?

La solution

Une autre solution pourrait être d'utiliser keytool pour importer le certificat a expiré dans le keystore côté client comme un certificat de confiance. Avez-vous essayé?

Une meilleure alternative serait de remplacer le certificat a expiré sur le serveur avec un certificat en cours qui ne sont pas auto-signé.

Autres conseils

Voici la solution obtenue en combinant java - ignorer certificat SSL expiré et < a href = "https://stackoverflow.com/questions/6031258/java-ssl-how-to-disable-hostname-verification"> Java SSL. comment désactiver la vérification hostname

public class IgnoreExpiredServerCertificateAgent {

    public static void premain(String args, Instrumentation inst) throws Exception {
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init((KeyStore) null);

        TrustManager[] trustManagers = tmf.getTrustManagers();
        final X509TrustManager origTrustManager = (X509TrustManager) trustManagers[0];

        TrustManager[] wrappedTrustManagers = new TrustManager[]{
                new X509TrustManager() {
                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return origTrustManager.getAcceptedIssuers();
                    }

                    @Override
                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        origTrustManager.checkClientTrusted(certs, authType);
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        try {
                            origTrustManager.checkServerTrusted(certs, authType);
                        } catch (CertificateExpiredException ignored) {
                        }
                    }
                }
        };

        //SSLContext sc = SSLContext.getDefault();
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, wrappedTrustManagers, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
    }
}

Ensuite, il suffit d'ajouter -javaagent:IgnoreExpiredServerCertificateAgent.jar aux arguments de démarrage du programme java.

Voir aussi la différence entre SSL et TLS et leur utilisation en Java et Java 8 SSLContext.getInstance ( "TLSv1.2") ce que cela signifie? ne pour argument approprié pour SSLContext.getInstance() dans votre cas.


Notez également que le serveur avec certificat expiré peut également se vérifier à l'expiration du certificat client correspondant:

  

Causé par: javax.net.ssl.SSLHandshakeException: alerte fatale reçu:   certificate_expired à   com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:174)     à   com.sun.net.ssl.internal.ssl.Alerts.getSSLException (Alerts.java:136)     à   com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert (SSLSocketImpl.java:1822)     à   com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord (SSLSocketImpl.java:1004)     à   com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake (SSLSocketImpl.java:1188)     à   com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1215)     à   com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake (SSLSocketImpl.java:1199)     à   sun.net.www.protocol.https.HttpsClient.afterConnect (HttpsClient.java:434)     à   sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect (AbstractDelegateHttpsURLConnection.java:166)     à   sun.net.www.protocol.http.HttpURLConnection.getInputStream (HttpURLConnection.java:1195)     à   java.net.HttpURLConnection.getResponseCode (HttpURLConnection.java:379)     à   sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode (HttpsURLConnectionImpl.java:318)

Si vous rencontrez ce stacktrace alors il n'y a aucun moyen d'atténuer le problème sans toucher le serveur. Et la bonne solution serait de renouveler le certificat avec la date d'expiration future.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top