2016-04-01 7 views
6

Wie kann ich einen GET Anruf mit Rest-Assured in Java zu einem Endpunkt machen, der Zertifikat benötigt. Ich habe ein Zertifikat als .pem Format. In der PEM-Datei gibt es ein Zertifikat und einen privaten Schlüssel.Wie mache ich HTTPS GET Anruf mit Zertifikat im Rest-Assured Java

+0

ich es zu konvertieren versucht, jks und in RestAssured.keystore verwendet (jks, "passwrd"), aber es gibt Fehler - PKIX-Pfadaufbau fehlgeschlagen: sun.security.provider.certpath.SunCertPathBuilderException: kann gültigen Zertifizierungspfad zum angeforderten Ziel nicht finden – rohitkadam19

+0

Verwenden Sie die neueste Version von 2.9.0? – Johan

+0

@Johan Ja, mit der neuesten Version 2.9.0 – rohitkadam19

Antwort

6

verwenden Verstanden mit folgenden Code arbeiten -

KeyStore keyStore = null; 
SSLConfig config = null; 

try { 
     keyStore = KeyStore.getInstance("PKCS12"); 
     keyStore.load(
       new FileInputStream("certs/client_cert_and_private.p12"), 
       password.toCharArray()); 

    } catch (Exception ex) { 
     System.out.println("Error while loading keystore >>>>>>>>>"); 
     ex.printStackTrace(); 
    } 

    if (keyStore != null) { 

     org.apache.http.conn.ssl.SSLSocketFactory clientAuthFactory = new org.apache.http.conn.ssl.SSLSocketFactory(keyStore, password); 

     // set the config in rest assured 
     config = new SSLConfig().with().sslSocketFactory(clientAuthFactory).and().allowAllHostnames(); 

RestAssured.config = RestAssured.config().sslConfig(config); 
RestAssured.given().when().get("/path").then(); 
+0

Ich versuche das Gleiche ... Können Sie mir sagen, wie Sie das Zertifikat für den Endpunkt erhalten haben? –

+0

@HarishTalanki Ich habe Zertifikate vom Entwickler – rohitkadam19

+0

Ich hatte eine Umgehungsmöglichkeit dafür. Aber ich schätze Ihre Antwort sehr. Vielen Dank. –

1

Ich bin neu zu sicher sein, aber ich weiß, diese Art von Problemen digitale Zertifikate für die Client-Authentifizierung

In Ruhesicher doc mit nur eine Option Zertifikat konfigurieren: JKS

RestAssured.config = RestAssured.newConfig().sslConfig(new SSLConfig("/truststore_javanet.jks", "test1234"); 

Convert Ihre PEM zu JKS. Öffnen Sie es mit porcle und stellen Sie sicher, dass das Passwort korrekt ist und Sie das Zertifikat geladen und die gesamte Zertifizierungskette zu CA root haben. Portecle vereinfachen die Befehlszeile ein GUI und ermöglicht Ihnen auch die JKS

http://portecle.sourceforge.net/ 

Dieser Fehler IMMER erstellen tritt auf, wenn Ihr Java-Client in Serverzertifikat nicht vertrauen

PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

Der einfachste Weg zu beheben Dazu gehört die Server-Zertifikatskette in Ihrem jdk-Keystore.

Laden Sie zuerst die Serverzertifikate herunter, die eine https-Verbindung mit Ihrem Browser öffnen, z. B. mit Chrome. Es macht nichts, es scheitert. Klicken Sie auf das grüne Schloss in der Symbolleiste> Detail> Serverzertifikat anzeigen und als PEM herunterladen. Es ist am besten, es selbst herunterzuladen, um sicherzustellen, dass Sie das richtige verwenden. Laden Sie alle Zertifikate der Zertifizierungskette herunter enter image description here

Öffnen Sie dann jdk cacerts unter JDK_HOME/jre/lib/security mit portecle. Das Passwort wird "ändern". Fügen Sie die Serverzertifikate als 'vertrauenswürdig' hinzu.

Nun wird der fehlgeschlagene PKIX-Pfadaufbau verschwinden. Falls nicht, die Zertifikate überprüfen und die JDK Sie

+0

Ich habe das versucht, aber es sagt "Kein erforderliches SSL-Zertifikat wurde gesendet". Ich erstelle Schlüsselspeicher und füge ihn zu RestAssured hinzu. – rohitkadam19

+0

In einem SSL-Handshake wird die Zertifikatsauthentifizierungsanforderung nach der Verifizierung des Server-Zertifikatports OCCURS übergeben. Daher wird der erste Schritt übergeben. Sind Sie sicher, dass Ihr JKS-Zertifikat vom Server akzeptiert wird? Ist ein falsches Passwort falsch oder wurde JKS nicht gefunden? – pedrofb

0

Die unten genannten Code nur funktioniert,

public static void getArtifactsHttps(String args) { 
    String username = "username"; 
    String password1 = "password"; 
    StringBuilder authorization = new StringBuilder(); 
    authorization.append(username).append(":").append(password); 
    String authHeader = "Basic " + Base64.getEncoder().encodeToString(authorization.toString().getBytes()); 


    String response = RestAssured 
      .given() 
      .trustStore("D:\\workspace\\DemoTrust.jks", "DemoTrustKeyStorePassPhrase") 
      .when() 
      .contentType(MediaType.APPLICATION_JSON) 
      .accept(MediaType.APPLICATION_JSON) 
      .header("Authorization", authHeader) 
      .baseUri("https://server.us.oracle.com:55898") 
      .queryParam("name", args) 
      .get("/validendpoint").prettyPrint(); 

    System.out.println("RESPONSE" + response); 
} 
2

In meinem Fall mit „relaxed HTTPs Validierung“fixed mein Problem:

given().relaxedHTTPSValidation().when().post("https://my_server.com") 
0

Mit RestAssured 3.0 ich habe @rohitkadam 19 Code und bekam Arbeit es so:

@Before 
public void setUp() throws Exception { 
    try { 
     RestAssured.port = port; 
     RestAssured.useRelaxedHTTPSValidation(); 
     RestAssured.config().getSSLConfig().with().keyStore("classpath:keystore.p12", "password"); 
    } catch (Exception ex) { 
     System.out.println("Error while loading keystore >>>>>>>>>"); 
     ex.printStackTrace(); 
    } 
} 
0

Bitte neueste Version 3.0.7 als in früheren Versionen von Rest-sicher viel Problem verwenden hat konfrontiert, wenn Sie Dienste mit Zertifikaten testen

Verwandte Themen