Frage

    

Diese Frage bereits eine Antwort hier:

         

Ich weiß, es gibt viele verschiedene Fragen und so viele Antworten über dieses Problem ... Aber ich kann nicht verstehen ...

ich habe: ubuntu-9.10-desktop-amd64 + NetBeans6.7.1 installiert von off "wie es ist". rep. Ich brauche über das HTTPS zu einem gewissen Ort zu verbinden. Dazu verwende ich Apache Httpclient.

Von Tutorial lese ich:

"Sobald Sie JSSE richtig installiert, sichere HTTP-Kommunikation über SSL als
sein sollte  einfach als Plain-HTTP-Kommunikation „und einige Beispiel:.

HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.verisign.com/"); 
try { 
  httpclient.executeMethod(httpget);
  System.out.println(httpget.getStatusLine());
} finally {
  httpget.releaseConnection();
}

Inzwischen schreibe ich diese:

HttpClient client = new HttpClient();

HttpMethod get = new GetMethod("https://mms.nw.ru");
//get.setDoAuthentication(true);

try {
    int status = client.executeMethod(get);
    System.out.println(status);

    BufferedInputStream is = new BufferedInputStream(get.getResponseBodyAsStream());
    int r=0;byte[] buf = new byte[10];
    while((r = is.read(buf)) > 0) {
        System.out.write(buf,0,r);
    }

} catch(Exception ex) {
    ex.printStackTrace();
}

Als Ergebnis Ich habe eine Reihe von Fehlern:

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
        at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
        at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1627)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:204)
        at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:198)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:994)
        at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:142)
        at sun.security.ssl.Handshaker.processLoop(Handshaker.java:533)
        at sun.security.ssl.Handshaker.process_record(Handshaker.java:471)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:904)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1132)
        at sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:643)
        at sun.security.ssl.AppOutputStream.write(AppOutputStream.java:78)
        at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
        at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
        at org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:828)
        at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2116)
        at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
        at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
        at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
        at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)
        at simpleapachehttp.Main.main(Main.java:41)
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:302)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:205)
        at sun.security.validator.Validator.validate(Validator.java:235)
        at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:147)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:230)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:270)
        at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:973)
        ... 17 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:191)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:255)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:297)
        ... 23 more

Was habe ich zu tun einfachste SSL-Verbindung zu schaffen? (Wahrscheinlich ohne KeyManager und Trust-Manager etc., während.)

War es hilfreich?

Lösung

https://mms.nw.ru verwendet ein selbst signiertes Zertifikat, das offensichtlich nicht in enthalten ist die Standardeinstellung Vertrauen Manager.

Sie werden müssen, eine der folgenden Möglichkeiten:

  • Konfigurieren Sie den SSL-Kontext mit einem Trustmanager, die jede cert (siehe unten)

  • akzeptiert
  • Konfigurieren des SSL-Kontext mit einem entsprechenden Vertrauensspeicher, die Ihr Zertifikat enthält

  • Fügen Sie das Zertifikat für diese Website auf die Standard-Java Trust Store.

Hier ist ein Beispielprogramm, das einen (meist wertlos) SSL-Kontext erstellt, die jede cert akzeptiert:

import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLTest {

    public static void main(String [] args) throws Exception {
        // configure the SSLContext with a TrustManager
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        URL url = new URL("https://mms.nw.ru");
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
        System.out.println(conn.getResponseCode());
        conn.disconnect();
    }

    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
}

Andere Tipps

https://mms.nw.ru nutzt wahrscheinlich ein Zertifikat nicht von einer Zertifizierungsstelle ausgestellt. Folglich müssen Sie das Zertifikat Ihres Vertrauens Java Schlüsselspeicher hinzuzufügen, wie erklärt in derzeit keine gültige Zertifizierung finden Pfad zum angeforderten Ziel :

  

Wenn auf einem Client arbeiten, die funktionieren   Mit einem SSL-fähigen Server läuft in   https-Protokoll, können Sie Fehlermeldung erhalten   ‚Nicht in der Lage gültige Zertifizierung zu finden   Pfad zum angeforderten Ziel‘, wenn die   Server-Zertifikat nicht ausgegeben wird von   Zertifizierungsstelle, sondern eine Selbst   unterzeichnet oder von einem privaten CMS ausgegeben.

     

Keine Panik. Alles, was Sie tun müssen, ist zu   fügen Sie das Server-Zertifikat auf Ihre   vertrauenswürdige Java-Schlüsselspeicher, wenn Ihr Kunde   ist in Java geschrieben. Du könntest sein   fragen, wie, als ob Sie nicht zugreifen können   die Maschine, auf den Server   Eingerichtet. Es ist ein einfaches Programm   kann dir helfen. Bitte laden Sie die Java   Programm und run

% java InstallCert _web_site_hostname_
     

Dieses Programm eröffnet eine Verbindung zu   die angegebene Host und begann eine SSL   Händedruck. Es druckte die Ausnahme   Stapelüberwachung des Fehlers, der aufgetreten   und zeigt Ihnen die Zertifikate, die von   der Server. Nun werden Sie aufgefordert die hinzufügen   Zertifikat vertrauenswürdigen Schlüsselspeicher.

     

Wenn Sie Ihre Meinung geändert haben, geben Sie   'Q'. Wenn Sie wirklich wollen, dass die hinzufügen   Zertifikat, geben ‚1‘ oder ein anderes   Zahlen andere Zertifikate hinzufügen,   sogar ein CA-Zertifikat, aber Sie in der Regel   will nicht, das zu tun. Sobald du hast   Ihre Wahl getroffen haben, wird das Programm   zeigt das vollständige Zertifikat und   dann hat es zu einem Java-Schlüssel benannt   ‚Jssecacerts‘ in der aktuellen   Verzeichnis.

     

Um es in Ihrem Programm zu verwenden, entweder   konfigurieren JSSE verwenden es als sein Vertrauen   speichern oder kopieren Sie ihn in Ihre   $ JAVA_HOME / jre / lib / security.   Wenn Sie alle Java-Anwendungen   erkennt das Zertifikat als vertrauenswürdig   und nicht nur JSSE, können Sie auch   überschreiben Sie die Datei cacerts, dass   Verzeichnis.

     

Nach all dem wird JSSE der Lage sein,   Ergänzen einen Händedruck mit dem Host,   was Sie können überprüfen, indem der Lauf   Programm erneut aus.

     

Für weitere Details zu erhalten, können Sie prüfen,   Leeland Blog Nicht mehr ‚nicht gefunden   gültige Zertifizierungspfad angefordert   target '

Neben Pascal Thivent des richtigen Antwort, eine andere Art und Weise ist das Zertifikat von Firefox (Zertifikat anzeigen -> Details -> Export) zu speichern. Oder openssl s_client und importieren Sie es in den Trust Store

Sie sollten dies nur tun, wenn Sie eine Möglichkeit haben, das Zertifikat zu überprüfen. Gelingt das nicht, tun Sie es das erste Mal anschließen, wird es zumindest geben Sie eine Fehlermeldung, wenn das Zertifikat Änderungen unerwartet auf nachfolgende Verbindungen.

Um es in einem Trust Store zu importieren, zu verwenden:

keytool -importcert -keystore truststore.jks -file servercert.pem

Standardmäßig sollte der Standard Trust Store lib/security/cacerts werden und sein Passwort sollte changeit werden, finden Sie unter JSSE Reference Guide .

Wenn Sie nicht global das Zertifikat erlauben wollen, aber nur für diese Verbindungen, ist es möglich, eine SSLContext für ihn zu erstellen:

TrustManagerFactory tmf = TrustManagerFactory
    .getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("JKS");
FileInputStream fis = new FileInputStream("/.../truststore.jks");
ks.load(fis, null);
// or ks.load(fis, "thepassword".toCharArray());
fis.close();

tmf.init(ks);

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, tmf.getTrustManagers(), null);

Dann müssen Sie es für Apache HTTP-Client 3.x einzurichten um eins, wenn sein SecureProtocolSocketFactory diese SSLContext zu verwenden. (Es gibt Beispiele hier ).

Apache HTTP-Client 4.x (abgesehen von der frühesten Version) hat direkte Unterstützung eine SSLContext für das Bestehen.

Die Apache Httpclient 4.5 Art und Weise:

org.apache.http.ssl.SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
sslContextBuilder.loadTrustMaterial(new org.apache.http.conn.ssl.TrustSelfSignedStrategy());
SSLContext sslContext = sslContextBuilder.build();
org.apache.http.conn.ssl.SSLConnectionSocketFactory sslSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new org.apache.http.conn.ssl.DefaultHostnameVerifier());

HttpClientBuilder httpClientBuilder = HttpClients.custom().setSSLSocketFactory(sslSocketFactory);
httpClient = httpClientBuilder.build();

. HINWEIS: org.apache.http.conn.ssl.SSLContextBuilder ist veraltet und org.apache.http.ssl.SSLContextBuilder ist die neue (Bekanntmachung conn aus dessen Paketnamen fehlt)

http://hc.apache.org/httpclient-3.x/sslguide.html :

Protocol.registerProtocol("https", 
new Protocol("https", new MySSLSocketFactory(), 443));
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.whatever.com/");
try {
  httpclient.executeMethod(httpget);
      System.out.println(httpget.getStatusLine());
} finally {
      httpget.releaseConnection();
}

Wo MySSLSocketFactory Beispiel kann hier . Es verweist auf eine TrustManager, die Sie ändern können, alles vertrauen (obwohl man dies berücksichtigen müssen!)

Für Apache Httpclient 4.5+ & Java8:

SSLContext sslContext = SSLContexts.custom()
        .loadTrustMaterial((chain, authType) -> true).build();

SSLConnectionSocketFactory sslConnectionSocketFactory =
        new SSLConnectionSocketFactory(sslContext, new String[]
        {"SSLv2Hello", "SSLv3", "TLSv1","TLSv1.1", "TLSv1.2" }, null,
        NoopHostnameVerifier.INSTANCE);
CloseableHttpClient client = HttpClients.custom()
        .setSSLSocketFactory(sslConnectionSocketFactory)
        .build();

Aber wenn Ihr Httpclient verwenden, um einen Connectionmanager für die Suche nach Verbindung, z.B. wie folgt aus:

 PoolingHttpClientConnectionManager connectionManager = new 
         PoolingHttpClientConnectionManager();

 CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();

Die HttpClients.custom().setSSLSocketFactory(sslConnectionSocketFactory) hat keine Wirkung , wird das Problem nicht behoben.

Da, dass der Httpclient verwenden, um die angegebenen Connectionmanager für die Suche nach Verbindung und die angegebenen Connectionmanagern haben nicht unsere maßgeschneiderten SSLConnectionSocketFactory registrieren. Um dies zu beheben, sollten Sie sich das maßgeschneiderte SSLConnectionSocketFactory im Connectionmanager registrieren. Der richtige Code sollte diese mögen:

PoolingHttpClientConnectionManager connectionManager = new 
    PoolingHttpClientConnectionManager(RegistryBuilder.
                <ConnectionSocketFactory>create()
      .register("http",PlainConnectionSocketFactory.getSocketFactory())
      .register("https", sslConnectionSocketFactory).build());

CloseableHttpClient client = HttpClients.custom()
            .setConnectionManager(connectionManager)
            .build();

Sobald Sie eine Java-Cert Store (unter Verwendung der groß InstallCert Klasse oben erstellt wird), können Sie sich Java, es zu benutzen, indem Sie den „javax.net.ssl.trustStore“ param an java vorbei Anlaufen.

Beispiel:

java -Djavax.net.ssl.trustStore=/path/to/jssecacerts MyClassName

Ein weiteres Problem, das Sie in mit selbst signierten Test Zert laufen können, ist dies:

java.io.IOException: HTTPS Hostname falsch: sollte ...

Dieser Fehler tritt auf, wenn Sie versuchen, eine HTTPS-URL zuzugreifen. Sie könnten bereits den Zertifikatserver installiert haben, um Ihre JRE-Schlüsselspeicher. Aber dieser Fehler bedeutet, dass der Name des Server-Zertifikats nicht mit dem tatsächlichen Domain-Namen Übereinstimmen des Servers, der in der URL erwähnt wird. Dies geschieht normalerweise, wenn Sie ein nicht CA ausgestelltes Zertifikat verwenden.

Dieses Beispiel zeigt, wie ein HttpsURLConnection DefaultHostnameVerifier zu schreiben, die die Zertifikate Servernamen ignorieren:

http://www.java-samples.com/showtutorial.php? tutorialid = 211

will die Antwort einzufügen hier:

in Apache Httpclient 4.5.5

Wie ungültiges SSL zu handhaben Zertifikat mit Apache-Client 4.5.5?

HttpClient httpClient = HttpClients
            .custom()
            .setSSLContext(new SSLContextBuilder().loadTrustMaterial(null, TrustAllStrategy.INSTANCE).build())
            .setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
            .build();

Für eine Möglichkeit zum einfachen Hosts, die Sie zur Laufzeit vertrauen hinzufügen, ohne alle Prüfungen zu werfen, versuchen Sie den Code hier: http://code.google.com/p/self-signed-cert-trust-manager/ .

EasySSLProtocolSocketFactory gab mir Probleme, damit ich meine eigene ProtocolSocketFactory endete umzusetzen.

Zuerst müssen Sie es registrieren:

Protocol.registerProtocol("https", new Protocol("https", new TrustAllSSLSocketFactory(), 443));

HttpClient client = new HttpClient();
...

Dann implementieren ProtocolSocketFactory:

class TrustAllSSLSocketFactory implements ProtocolSocketFactory {

    public static final TrustManager[] TRUST_ALL_CERTS = new TrustManager[]{
        new X509TrustManager() {
            public void checkClientTrusted(final X509Certificate[] certs, final String authType) {

            }

            public void checkServerTrusted(final X509Certificate[] certs, final String authType) {

            }

            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        }
    };

    private TrustManager[] getTrustManager() {
        return TRUST_ALL_CERTS;
    }

    public Socket createSocket(final String host, final int port, final InetAddress clientHost,
                               final int clientPort) throws IOException {
        return getSocketFactory().createSocket(host, port, clientHost, clientPort);
    }

    @Override
    public Socket createSocket(final String host, final int port, final InetAddress localAddress,
                               final int localPort, final HttpConnectionParams params) throws IOException {
        return createSocket(host, port);
    }

    public Socket createSocket(final String host, final int port) throws IOException {
        return getSocketFactory().createSocket(host, port);
    }

    private SocketFactory getSocketFactory() throws UnknownHostException {
        TrustManager[] trustAllCerts = getTrustManager();

        try {
            SSLContext context = SSLContext.getInstance("SSL");
            context.init(null, trustAllCerts, new SecureRandom());

            final SSLSocketFactory socketFactory = context.getSocketFactory();
            HttpsURLConnection.setDefaultSSLSocketFactory(socketFactory);
            return socketFactory;
        } catch (NoSuchAlgorithmException | KeyManagementException exception) {
            throw new UnknownHostException(exception.getMessage());
        }
    }
}

Hinweis: Dies ist mit Httpclient 3.1 und Java 8

Das Link erklärt die Anforderung, die Sie Schritt für Schritt haben. Wenn Sie sind nicht wirklich das Zertifikat besorgt können Sie mit dem Prozess in folgendem Link gehen.

Hinweis: Sie mögen vielleicht verdoppeln überprüfen, was Sie tun, da dies ein unsicherer Betrieb ist.

die InstallCert Mit der jssecacerts-Datei zu erzeugen und tun -Djavax.net.ssl.trustStore=/path/to/jssecacerts hat super funktioniert.

Ich bin useing Httpclient 3.1.x, und das funktioniert für mich

        try {
        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager trustManager = new X509TrustManager() {
            @Override
            public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
            }

            @Override
            public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {

            }

            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return null;
            }
        };
        sslContext.init(null, new TrustManager[]{trustManager}, null);
        SslContextSecureProtocolSocketFactory socketFactory = new SslContextSecureProtocolSocketFactory(sslContext,false);
        Protocol.registerProtocol("https", new Protocol("https", (ProtocolSocketFactory) socketFactory, 443));//同样会影响到HttpUtils
    } catch (Throwable e) {
        e.printStackTrace();

}

public class SslContextSecureProtocolSocketFactory implements      SecureProtocolSocketFactory {

private SSLContext sslContext;
private boolean verifyHostname;

public SslContextSecureProtocolSocketFactory(SSLContext sslContext, boolean verifyHostname) {
    this.verifyHostname = true;
    this.sslContext = sslContext;
    this.verifyHostname = verifyHostname;
}

public SslContextSecureProtocolSocketFactory(SSLContext sslContext) {
    this(sslContext, true);
}

public SslContextSecureProtocolSocketFactory(boolean verifyHostname) {
    this((SSLContext)null, verifyHostname);
}

public SslContextSecureProtocolSocketFactory() {
    this((SSLContext)null, true);
}

public synchronized void setHostnameVerification(boolean verifyHostname) {
    this.verifyHostname = verifyHostname;
}

public synchronized boolean getHostnameVerification() {
    return this.verifyHostname;
}

public Socket createSocket(String host, int port, InetAddress clientHost, int clientPort) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(host, port, clientHost, clientPort);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(String host, int port, InetAddress localAddress, int localPort, HttpConnectionParams params) throws IOException, UnknownHostException, ConnectTimeoutException {
    if(params == null) {
        throw new IllegalArgumentException("Parameters may not be null");
    } else {
        int timeout = params.getConnectionTimeout();
        Socket socket = null;
        SSLSocketFactory socketfactory = this.getSslSocketFactory();
        if(timeout == 0) {
            socket = socketfactory.createSocket(host, port, localAddress, localPort);
        } else {
            socket = socketfactory.createSocket();
            InetSocketAddress localaddr = new InetSocketAddress(localAddress, localPort);
            InetSocketAddress remoteaddr = new InetSocketAddress(host, port);
            socket.bind(localaddr);
            socket.connect(remoteaddr, timeout);
        }

        this.verifyHostname((SSLSocket)socket);
        return socket;
    }
}

public Socket createSocket(String host, int port) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(host, port);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
    SSLSocketFactory sf = this.getSslSocketFactory();
    SSLSocket sslSocket = (SSLSocket)sf.createSocket(socket, host, port, autoClose);
    this.verifyHostname(sslSocket);
    return sslSocket;
}

private void verifyHostname(SSLSocket socket) throws SSLPeerUnverifiedException, UnknownHostException {
    synchronized(this) {
        if(!this.verifyHostname) {
            return;
        }
    }

    SSLSession session = socket.getSession();
    String hostname = session.getPeerHost();

    try {
        InetAddress.getByName(hostname);
    } catch (UnknownHostException var10) {
        throw new UnknownHostException("Could not resolve SSL sessions server hostname: " + hostname);
    }

    X509Certificate[] certs = (X509Certificate[])((X509Certificate[])session.getPeerCertificates());
    if(certs != null && certs.length != 0) {
        X500Principal subjectDN = certs[0].getSubjectX500Principal();
        List cns = this.getCNs(subjectDN);
        boolean foundHostName = false;
        Iterator i$ = cns.iterator();
        AntPathMatcher matcher  = new AntPathMatcher();
        while(i$.hasNext()) {
            String cn = (String)i$.next();
            if(matcher.match(cn.toLowerCase(),hostname.toLowerCase())) {
                foundHostName = true;
                break;
            }
        }

        if(!foundHostName) {
            throw new SSLPeerUnverifiedException("HTTPS hostname invalid: expected \'" + hostname + "\', received \'" + cns + "\'");
        }
    } else {
        throw new SSLPeerUnverifiedException("No server certificates found!");
    }
}

private List<String> getCNs(X500Principal subjectDN) {
    ArrayList cns = new ArrayList();
    StringTokenizer st = new StringTokenizer(subjectDN.getName(), ",");

    while(st.hasMoreTokens()) {
        String cnField = st.nextToken();
        if(cnField.startsWith("CN=")) {
            cns.add(cnField.substring(3));
        }
    }

    return cns;
}

protected SSLSocketFactory getSslSocketFactory() {
    SSLSocketFactory sslSocketFactory = null;
    synchronized(this) {
        if(this.sslContext != null) {
            sslSocketFactory = this.sslContext.getSocketFactory();
        }
    }

    if(sslSocketFactory == null) {
        sslSocketFactory = (SSLSocketFactory)SSLSocketFactory.getDefault();
    }

    return sslSocketFactory;
}

public synchronized void setSSLContext(SSLContext sslContext) {
    this.sslContext = sslContext;
}

}

Für Httpclient, wir können dies tun:

SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        String uri = new StringBuilder("url").toString();

        HostnameVerifier hostnameVerifier = new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        };

        HttpClient client = HttpClientBuilder.create().setSSLContext(ctx)
                .setSSLHostnameVerifier(hostnameVerifier).build()

folgen Sie der unten angegebenen Anleitung für Java 1.7, ein SSL-Zertifikat erstellen InstallCert.java Programmdatei verwendet wird.

https://github.com/escline/InstallCert

Sie müssen die tomcat neu starten

Die folgend zusammen mit DefaultTrustManager und es funktioniert in Httpclient wie Charme. Danke vielmals!! @ Kevin und alle anderen Beiträger

    SSLContext ctx = null;
    SSLConnectionSocketFactory sslsf = null;
    try {

        ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        sslsf = new SSLConnectionSocketFactory(
                ctx,
                new String[] { "TLSv1" },
                null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());

    } catch (Exception e) {
        e.printStackTrace();
    }

     CloseableHttpClient client = HttpClients.custom()
            .setSSLSocketFactory(sslsf)
            .build();

Ich war zufällig das gleiche Problem konfrontiert, ganz plötzlich alle meine Importe fehlten. Ich habe versucht, zu löschen alle Inhalte in meinem .m2 Ordner. Und zu versuchen, wieder importiert alles, aber immer noch nichts gearbeitet. Schließlich, was ich tat eröffnet wurde die Website, für die die IDE beschwerte sich, dass es nicht in meinem Browser herunterladen konnte. Und sah das Zertifikat es wurde mit und sah in meinem

$ keytool -v -list  PATH_TO_JAVA_KEYSTORE

Pfad zu meinem Schlüsselspeicher war /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts

, dass bestimmte Zertifikat nicht da war.

Also alles, was Sie tun müssen, ist wieder das Zertifikat in die JAVA JVM Schlüsselspeicher setzen. Es kann mit dem folgenden Befehl durchgeführt werden.

$ keytool -import -alias ANY_NAME_YOU_WANT_TO_GIVE -file PATH_TO_YOUR_CERTIFICATE -keystore PATH_OF_JAVA_KEYSTORE

Wenn es für Passwort fragt, versuchen, das Standardpasswort ‚changeit‘ Wenn Sie die Berechtigung Fehlermeldung erhalten, wenn Sie diesen Befehl ausführen. In Fenster öffnen Sie es in Administrator-Modus. In Mac und Unix verwenden sudo.

Nachdem Sie den Schlüssel erfolgreich hinzugefügt, Sie können es betrachten:

$ keytool -v -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 

Sie können nur die SHA-1 mit teh Befehl

ansehen
$ keytool -list  /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/lib/security/cacerts 
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top