java - commons - spring boot resttemplate ssl




HttpGet mit HTTPS: SSLPeerUnverifiedException (4)

Diese Antwort folgt auf owlstead und Mat 's Antworten. Dies gilt für SE / EE-Installationen, nicht für ME / Mobile / Android SSL.

Da niemand es noch erwähnt hat, werde ich den "Produktionsweg" erwähnen, um dies zu beheben: Befolgen Sie die Schritte von der AuthSSLProtocolSocketFactory Klasse in HttpClient , um Ihre Trust Store & Key Stores zu aktualisieren.

  1. Importieren Sie ein vertrauenswürdiges Zertifikat und erstellen Sie eine Truststore-Datei

keytool -import -alias "my server cert" -file server.crt -keystore my.truststore

  1. Erzeugen Sie einen neuen Schlüssel (verwenden Sie das gleiche Passwort wie der Truststore)

keytool -genkey -v -alias "my client key" -validity 365 -keystore my.keystore

  1. Zertifikatsignierungsanforderung (CSR) ausgeben

keytool -certreq -alias "my client key" -file mycertreq.csr -keystore my.keystore

  1. (selbstsignieren oder erhalten Sie Ihr Zertifikat)

  2. Importieren Sie das vertrauenswürdige CA-Stammzertifikat

keytool -import -alias "my trusted ca" -file caroot.crt -keystore my.keystore

  1. Importieren Sie die PKCS # 7-Datei, die die vollständige Zertifikatskette enthält

keytool -import -alias "my client key" -file mycert.p7 -keystore my.keystore

  1. Überprüfen Sie den Inhalt der resultierenden Keystore-Datei

keytool -list -v -keystore my.keystore

Wenn Sie kein Serverzertifikat haben, erstellen Sie eines im JKS-Format und exportieren Sie es als CRT-Datei. Quelle: Keytool-Dokumentation

keytool -genkey -alias server-alias -keyalg RSA -keypass changeit
    -storepass changeit -keystore my.keystore

keytool -export -alias server-alias -storepass changeit
    -file server.crt -keystore my.keystore

Bei Verwendung von HttpClient erhalte ich den folgenden Fehler beim Versuch, über HTTPS zu kommunizieren:

Ausnahme im Thread "main" javax.net.ssl.SSLPeerUnverifiedException: Peer nicht authentifiziert.

Hier ist mein Code:

URI loginUri = new URI("https://myUrl.asp");

HttpClient httpclient = new DefaultHttpClient();
HttpGet httpget = new HttpGet( loginUri );
HttpResponse response = httpclient.execute( httpget );

Wie kann ich diesen Fehler unterdrücken oder entfernen?


Diese Ausnahme tritt auf, wenn Ihr Server auf JDK 7 basiert und Ihr Client sich auf JDK 6 befindet und SSL-Zertifikate verwendet. In JDK 7 sslv2hello Nachricht Handshaking ist standardmäßig deaktiviert, während in JDK 6 sslv2hello Nachricht Handshaking aktiviert ist. Aus diesem Grund wird, wenn Ihr Client versucht, den Server zu verbinden, eine sslv2hello-Nachricht an den Server gesendet und aufgrund der sslv2hello-Nachricht deaktiviert, erhalten Sie diese Ausnahme. Um dies zu lösen, müssen Sie entweder Ihren Client nach JDK 7 verschieben oder Sie müssen die Version 6u91 von JDK verwenden. Aber um diese Version von JDK zu bekommen, müssen Sie die


Methode, die einen "secureClient" zurückgibt (in einer Java 7-Umgebung - NetBeans IDE und GlassFish Server: Port https standardmäßig 3920), hoffe, dies könnte helfen:

public DefaultHttpClient secureClient() {
    DefaultHttpClient httpclient = new DefaultHttpClient();
    SSLSocketFactory sf;

    KeyStore trustStore;
    FileInputStream trustStream = null;
    File truststoreFile;
    // java.security.cert.PKIXParameters for the trustStore
    PKIXParameters pkixParamsTrust;

    KeyStore keyStore;
    FileInputStream keyStream = null;
    File keystoreFile;
    // java.security.cert.PKIXParameters for the keyStore
    PKIXParameters pkixParamsKey;

    try {
        trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        truststoreFile = new File(TRUSTSTORE_FILE);
        keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
        keystoreFile = new File(KEYSTORE_FILE);
        try {
            trustStream = new FileInputStream(truststoreFile);
            keyStream = new FileInputStream(keystoreFile);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            trustStore.load(trustStream, PASSWORD.toCharArray());
            keyStore.load(keyStream, PASSWORD.toCharArray());
        } catch (IOException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (CertificateException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            pkixParamsTrust = new PKIXParameters(trustStore);
            // accepts Server certificate generated with keytool and (auto) signed by SUN
            pkixParamsTrust.setPolicyQualifiersRejected(false);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            pkixParamsKey = new PKIXParameters(keyStore);
            // accepts Client certificate generated with keytool and (auto) signed by SUN
            pkixParamsKey.setPolicyQualifiersRejected(false);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }
        try {
            sf = new SSLSocketFactory(trustStore);
            ClientConnectionManager manager = httpclient.getConnectionManager();
            manager.getSchemeRegistry().register(new Scheme("https", 3920, sf));
        } catch (KeyManagementException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnrecoverableKeyException ex) {
            Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
        }

    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
    } catch (KeyStoreException ex) {
        Logger.getLogger(ApacheHttpRestClient.class.getName()).log(Level.SEVERE, null, ex);
    }
    // use the httpclient for any httpRequest
    return httpclient;
}

Mit HttpClient 3.x müssen Sie dies tun:

Protocol easyHttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyHttps);

Eine Implementierung von EasySSLProtocolSocketFactory finden Sie here .







httpclient