Comment passer un proxy lors du lancement de REST avec SSL en Java

Je développe un service qui connecte REST à Java, et avez-vous des demandes que je connecte? Il y a un cas que je veux confirmer. Dans un tel cas, je passe par un proxy, mais j'ai cherché comment le faire et j'organiserai les résultats. Le client Java REST utilise la partie client de Jersey, qui est également l'implémentation de référence de JAX-RS.

Je suis toujours reconnaissant de la sagesse de mes prédécesseurs. En gros, j'ai fait référence aux informations sur ce site. Comment passer un proxy avec Jersey Client

Cependant, au moins dans l'API à laquelle j'accède cette fois, l'erreur suivante de SSL

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

Cela semble se produire, je vais donc me concentrer sur l'enquête supplémentaire.

Paramètres pom.xml

pom.xml


<!--Mais si vous utilisez simplement le client Jersey-->
<dependency>
  <groupId>org.glassfish.jersey.core</groupId>
  <artifactId>jersey-client</artifactId>
  <version>2.25</version>
</dependency>

<!--De plus, lors de l'utilisation de Proxy avec Jersey.-->
<dependency>
  <groupId>org.glassfish.jersey.connectors</groupId>
  <artifactId>jersey-apache-connector</artifactId>
  <version>2.25</version>
</dependency>

Construire un client

La destination d'accès est l'API de Qiita

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

J'essaierai de cibler.

D'abord avec curl.

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

Je pense que du JSON est retourné.

En Java

Vient ensuite Java. Le premier est le modèle qui ne passe pas par le proxy.

Nous allons l'implémenter en se référant au document suivant. 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();
    }

}

Vous devriez obtenir le même résultat qu'avec curl.

Essayez via le proxy.

Veuillez vous référer à la page suivante et au site que j'ai mentionné plus tôt comme référence. Comment passer un proxy avec 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();

        //Fournisseur de support proxy?À
        config.connectorProvider(new ApacheConnectorProvider());
        config.property(ClientProperties.PROXY_URI, proxyHost);
        // config.property(ClientProperties.PROXY_USERNAME, "userName");
        // config.property(ClientProperties.PROXY_PASSWORD, "password");

        //Générer un constructeur
        ClientBuilder b = ClientBuilder.newBuilder().withConfig(config);
        return b.build();
    }

}

Lorsque je l'exécute, j'obtiens toujours une exception javax.net.ssl.SSLHandshakeException. Il semble que vous essayez de vous connecter à un serveur SSL non approuvé via un proxy. Insérez donc le code suivant pour invalider le processus de vérification du certificat SSL et le processus de vérification du nom d'hôte.

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();

        //Fournisseur de support proxy?À
        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();

        //Générer un constructeur
        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;}
        };
    }
}

Cela semble fonctionner. .. Il semble qu'il puisse également gérer les cas où le serveur de test a un certificat oléore.

Liens connexes

Comment passer un proxy avec Jersey Client Jersey 2.25 User Guide/5. Client API Jersey 2.25 User Guide/5.9. Securing a Client

Recommended Posts

Comment passer un proxy lors du lancement de REST avec SSL en Java
Comment afficher une page Web en Java
Comment créer un URI de données (base64) en Java
Comment convertir A en A et A en A en utilisant le produit logique et la somme en Java
Comment convertir un fichier en tableau d'octets en Java
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Comment stocker des chaînes de ArrayList à String en Java (personnel)
Comment développer et enregistrer une application Sota en Java
Comment simuler le téléchargement de formulaires post-objet vers OSS en Java
Comment configurer un proxy avec authentification dans Feign
Comment créer un conteneur Java
Comment apprendre JAVA en 7 jours
Comment initialiser par lots des tableaux avec Java que je ne savais pas quand j'étais débutant
Comment utiliser les classes en Java?
Comment nommer des variables en Java
Comment créer un tableau Java
Comment concaténer des chaînes avec Java
Comment faire fonctionner automatiquement un écran créé en Java sous Windows
Comment résoudre l'erreur inconnue apparue lors de l'utilisation de slf4j en Java
Comment créer un résumé de calendrier Java
Lors de la recherche de plusieurs dans un tableau Java
Comment implémenter le calcul de la date en Java
Comment implémenter le filtre de Kalman par Java
Prise en charge multilingue de Java Comment utiliser les paramètres régionaux
Comment insérer une vidéo dans Rails
Comment faire une conversion de base en Java
[Introduction à Java] Comment écrire un programme Java
Comment créer un robot Discord (Java)
Comment appliquer les conventions de codage en Java
Comment intégrer Janus Graph dans Java
Comment obtenir la date avec Java
Comment publier une bibliothèque dans jCenter
Comment tester une méthode privée et la simuler partiellement en Java
[IntelliJ IDEA] Comment ajouter automatiquement la finale lors de l'enregistrement d'un fichier Java
[Mémo personnel] Comment interagir avec le générateur de nombres aléatoires en Java
Comment trouver le nombre total de pages lors de la pagination en Java
Comment obtenir le chemin absolu d'un répertoire s'exécutant en Java
[Java] [Pour les débutants] Comment insérer des éléments directement dans un tableau à deux dimensions
Comment suivre quand un bucket géré par scoop change (principalement Java)
Comment référencer une colonne lors du remplacement de la méthode de nom de colonne dans ActiveRecord
Comment rediriger vers http-> https lorsque SSL est activé dans l'environnement Rails × Heroku
[Rails] Comment écrire lors de la création d'une sous-requête
Essayez de créer un babillard en Java
Comment réparer un crash lors de la suppression de données de royaume dans la liste de l'interface utilisateur Swift
Comment obtenir une classe depuis Element en Java
Une note quand vous voulez Tuple en Java
Je voulais que (a == 1 && a == 2 && a == 3) vrai en Java
Comment convertir un contrat de solidité en une classe de contrat Java
Comment exécuter une tâche djUnit dans Ant
Comment ajouter un chemin de classe dans Spring Boot
Comment créer un thème dans Liferay 7 / DXP
Comment masquer les champs nuls en réponse en Java
Comment compresser un fichier JAVA CSV et le gérer dans un tableau d'octets
Comment implémenter une fonctionnalité similaire dans Rails
Comment créer facilement un pull-down avec des rails
Comment implémenter le verrouillage optimiste dans l'API REST
Comment résoudre les problèmes d'expression en Java