So übergeben Sie einen Proxy, wenn Sie REST mit SSL in Java auslösen

Ich entwickle einen Dienst, der REST mit Java verbindet, und haben Sie Anfragen, die ich verbinde? Es gibt einen Fall, den ich bestätigen möchte. In einem solchen Fall gehe ich durch einen Proxy, habe aber untersucht, wie es geht, und ich werde die Ergebnisse organisieren. Der Java REST-Client verwendet den Client-Teil von Jersey, der auch die Referenzimplementierung von JAX-RS ist.

Ich bin immer dankbar für die Weisheit meiner Vorgänger. Grundsätzlich habe ich auf die Informationen auf dieser Seite verwiesen. So übergeben Sie einen Proxy mit Jersey Client

Zumindest in der API greife ich diesmal auf den folgenden SSL-Fehler zu

javax.ws.rs.ProcessingException: 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

Scheint aufzutreten, daher werde ich mich auf die zusätzliche Untersuchung konzentrieren.

pom.xml Einstellungen

pom.xml


<!--Aber wenn Sie nur den Jersey-Client verwenden-->
<dependency>
  <groupId>org.glassfish.jersey.core</groupId>
  <artifactId>jersey-client</artifactId>
  <version>2.25</version>
</dependency>

<!--Darüber hinaus bei Verwendung von Proxy mit Jersey.-->
<dependency>
  <groupId>org.glassfish.jersey.connectors</groupId>
  <artifactId>jersey-apache-connector</artifactId>
  <version>2.25</version>
</dependency>

Kunden aufbauen

Das Zugriffsziel ist die API von Qiita

https://qiita.com/api/v2/users/qiita/items?per_page=1&page=4

Ich werde versuchen zu zielen.

Zuerst mit Locken.

curl 'https://qiita.com/api/v2/users/qiita/items' -d 'per_page=1' -d 'page=4' -G

Ich denke, dass etwas JSON zurückgegeben wird.

In Java

Als nächstes kommt Java. Erstens ist das Muster, das nicht durch den Proxy geht.

Wir werden es unter Bezugnahme auf das folgende Dokument implementieren. Jersey 2.25 User Guide/5. Client API

ClientSamples.java



import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class ClientSamples {

    public static void main(String[] args) {
        new ClientSamples().execute();
    }

    public void execute() {
        String target = "https://qiita.com";
        String path = "/api/v2/users/qiita/items";

        // Client client = createSecureClient();
        Client client = createClient();
        Response restResponse = client
                .target(target)
                .path(path)
                .queryParam("page", "4")
                .queryParam("per_page", "1")
                .request(MediaType.APPLICATION_JSON_TYPE)
                .get();

        System.out.println(restResponse.readEntity(String.class));
    }

    private Client createClient() {
        return ClientBuilder.newClient();
    }

}

Sie sollten das gleiche Ergebnis wie mit Curl erhalten.

Versuchen Sie es über den Proxy.

Bitte beziehen Sie sich auf die folgende Seite und die Website, die ich zuvor als Referenz erwähnt habe. So übergeben Sie einen Proxy mit Jersey Client Jersey 2.25 User Guide/5.9. Securing a Client

ClientSamples.java


import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;

public class ClientSamples {

    public static void main(String[] args) {
        new ClientSamples().execute();
    }

    public void execute() {
        String target = "https://qiita.com";
        String path = "/api/v2/users/qiita/items";

        Client client = createSecureClient();
        // Client client = createClient();
        Response restResponse = client
                .target(target)
                .path(path)
                .queryParam("page", "4")
                .queryParam("per_page", "1")
                .request(MediaType.APPLICATION_JSON_TYPE).get();

        System.out.println(restResponse.readEntity(String.class));
    }

    private Client createSecureClient() {
        String proxyHost = "http://127.0.0.1:8080";
        ClientConfig config = new ClientConfig();

        //Proxy-Support-Anbieter?Zu
        config.connectorProvider(new ApacheConnectorProvider());
        config.property(ClientProperties.PROXY_URI, proxyHost);
        // config.property(ClientProperties.PROXY_USERNAME, "userName");
        // config.property(ClientProperties.PROXY_PASSWORD, "password");

        //Builder generieren
        ClientBuilder b = ClientBuilder.newBuilder().withConfig(config);
        return b.build();
    }

}

Wenn ich es ausführe, erhalte ich immer noch eine javax.net.ssl.SSLHandshakeException. Es sieht so aus, als würden Sie versuchen, über einen Proxy eine Verbindung zu einem nicht vertrauenswürdigen SSL-Server herzustellen. Geben Sie daher den folgenden Code ein, um den Überprüfungsprozess für SSL-Zertifikate und den Überprüfungsprozess für Hostnamen ungültig zu machen.

ClientSamples.java


import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig;
import org.glassfish.jersey.client.ClientProperties;


public class ClientSamples {

    public static void main(String[] args) {
        new ClientSamples().execute();
    }

    public void execute() {
        String target = "https://qiita.com";
        String path = "/api/v2/users/qiita/items";

        Client client = createSecureClient();
        // Client client = createClient();
        Response restResponse = client
                .target(target)
                .path(path)
                .queryParam("page", "4")
                .queryParam("per_page", "1")
                .request(MediaType.APPLICATION_JSON_TYPE)
                .get();

        System.out.println(restResponse.readEntity(String.class));
    }

    private Client createClient() {
        return ClientBuilder.newClient();
    }

    private Client createSecureClient() {
        String proxyHost = "http://127.0.0.1:8080";
        ClientConfig config = new ClientConfig();

        //Proxy-Support-Anbieter?Zu
        config.connectorProvider(new ApacheConnectorProvider());
        config.property(ClientProperties.PROXY_URI, proxyHost);
        // config.property(ClientProperties.PROXY_USERNAME, "userName");
        // config.property(ClientProperties.PROXY_PASSWORD, "password");

        SSLContext sslContext = createSSLContext();
        HostnameVerifier hostnameVerifier = createHostNameVerifier();

        //Builder generieren
        ClientBuilder b = ClientBuilder.newBuilder().withConfig(config)
                .sslContext(sslContext).hostnameVerifier(hostnameVerifier);
        return b.build();
    }

    private SSLContext createSSLContext() {
        SSLContext sslContext = null;
        try {
            sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null,
                    new X509TrustManager[] { new X509TrustManager() {
                        @Override
                        public void checkClientTrusted(X509Certificate[] chain,String authType) throws CertificateException {}
                        @Override
                        public void checkServerTrusted(X509Certificate[] chain,String authType) throws CertificateException {}
                        @Override
                        public X509Certificate[] getAcceptedIssuers() {return new X509Certificate[0];}
                    } }, new SecureRandom());
            // HttpsURLConnection
            // .setDefaultSSLSocketFactory(sslContext.getSocketFactory());

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        }
        return sslContext;
    }

    private HostnameVerifier createHostNameVerifier() {
        return new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {return true;}
        };
    }
}

Das scheint zu funktionieren. .. Es scheint, dass es auch Fälle behandeln kann, in denen der Testserver über ein Oleore-Zertifikat verfügt.

ähnliche Links

So übergeben Sie einen Proxy mit Jersey Client Jersey 2.25 User Guide/5. Client API Jersey 2.25 User Guide/5.9. Securing a Client

Recommended Posts

So übergeben Sie einen Proxy, wenn Sie REST mit SSL in Java auslösen
So zeigen Sie eine Webseite in Java an
So erstellen Sie einen Daten-URI (base64) in Java
So konvertieren Sie A in a und a in A mit logischem Produkt und Summe in Java
So konvertieren Sie eine Datei in ein Byte-Array in Java
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Speichern von Zeichenfolgen von ArrayList zu Zeichenfolge in Java (Personal)
So entwickeln und registrieren Sie eine Sota-App in Java
So simulieren Sie das Hochladen von Post-Object-Formularen in OSS in Java
So richten Sie einen Proxy mit Authentifizierung in Feign ein
So erstellen Sie einen Java-Container
Wie man JAVA in 7 Tagen lernt
Wie man Arrays mit Java stapelweise initialisiert, wusste ich als Anfänger nicht
Wie verwende ich Klassen in Java?
So benennen Sie Variablen in Java
So erstellen Sie ein Java-Array
So verketten Sie Zeichenfolgen mit Java
So bedienen Sie automatisch einen in Java unter Windows erstellten Bildschirm
So beheben Sie den unbekannten Fehler, der bei der Verwendung von slf4j in Java aufgetreten ist
So erstellen Sie eine Java-Kalenderzusammenfassung
Bei der Suche nach mehreren in einem Java-Array
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Mehrsprachige Unterstützung für Java Verwendung des Gebietsschemas
So fügen Sie ein Video in Rails ein
So führen Sie eine Basiskonvertierung in Java durch
[Einführung in Java] So schreiben Sie ein Java-Programm
Wie erstelle ich einen Discord Bot (Java)
So erzwingen Sie Codierungskonventionen in Java
Einbetten von Janus Graph in Java
So erhalten Sie das Datum mit Java
So veröffentlichen Sie eine Bibliothek in jCenter
So testen Sie eine private Methode und verspotten sie teilweise in Java
[IntelliJ IDEA] So fügen Sie beim Speichern einer Java-Datei automatisch final hinzu
[Persönliches Memo] Interaktion mit dem Zufallszahlengenerator in Java
So ermitteln Sie die Gesamtzahl der Seiten beim Paging in Java
So ermitteln Sie den absoluten Pfad eines in Java ausgeführten Verzeichnisses
[Java] [Für Anfänger] So fügen Sie Elemente direkt in ein zweidimensionales Array ein
Verfolgen, wann sich ein von Scoop verwalteter Bucket ändert (hauptsächlich Java)
So verweisen Sie auf eine Spalte, wenn Sie die Spaltennamensmethode in ActiveRecord überschreiben
So leiten Sie zu http-> https um, wenn SSL in der Rails × Heroku-Umgebung aktiviert ist
[Rails] Wie schreibe ich, wenn ich eine Unterabfrage mache?
Versuchen Sie, ein Bulletin Board in Java zu erstellen
So beheben Sie einen Absturz beim Löschen von Realm-Daten in der Liste der schnellen Benutzeroberfläche
So erhalten Sie eine Klasse von Element in Java
Ein Hinweis, wenn Sie Tupel in Java möchten
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
So konvertieren Sie einen Soliditätsvertrag in eine Java-Vertragsklasse
So führen Sie eine djUnit-Aufgabe in Ant aus
So fügen Sie in Spring Boot einen Klassenpfad hinzu
So erstellen Sie ein Thema in Liferay 7 / DXP
So verbergen Sie Nullfelder als Antwort in Java
So komprimieren Sie eine JAVA-CSV-Datei und verwalten sie in einem Byte-Array
So implementieren Sie eine ähnliche Funktion in Rails
So erstellen Sie einfach ein Pulldown mit Rails
So implementieren Sie optimistisches Sperren in der REST-API
So lösen Sie Ausdrucksprobleme in Java