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
<!--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>
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.
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.
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.
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.
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