web-dev-qa-db-fra.com

Comment faire un appel HTTPS GET avec certificat en java Rest-Assured

Comment effectuer un appel GET à l'aide de Rest-Assured en Java vers un noeud final nécessitant un certificat. J'ai un certificat au format .pem. Le fichier PEM contient un certificat et une clé privée. 

12
rohitkadam19

Je travaille avec le code suivant -

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

Dans mon cas, l'utilisation de "validation HTTPs assouplie" a résolu mon problème:

given().relaxedHTTPSValidation().when().post("https://my_server.com")
15
Saeed Zarinfam

Je suis nouveau, rassuré, mais je connais ce type de problèmes lors de l’utilisation des certificats numériques pour l’authentification du client.

Dans doc-reste-assuré est seulement une option pour configurer le certificat: JKS

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

Convertissez votre PEM en JKS. Ouvrez-le avec portecle et assurez-vous que le mot de passe est correct et que le certificat est chargé ainsi que toute la chaîne de certification au niveau racine de l'autorité de certification. Portecle simplifie la ligne de commande en utilisant une interface graphique et vous permet également de créer le JKS.

http://portecle.sourceforge.net/

Cette erreur se produit TOUJOURS lorsque votre client Java ne fait pas confiance au certificat de serveur.

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

Le moyen le plus simple de résoudre ce problème consiste à inclure la chaîne de certificats du serveur dans votre magasin de clés jdk.

Commencez par télécharger les certificats de serveur ouvrant une connexion https avec votre navigateur, par exemple avec chrome. Peu importe que cela échoue. Cliquez sur le verrou vert dans la barre d’outils> Détail> Voir le certificat de serveur et téléchargez-le au format PEM. Il est préférable de le télécharger vous-même pour vous assurer que vous utilisez le bon. Téléchargez tous les certificats de la chaîne de certification  enter image description here

Ensuite, ouvrez jdk cacerts dans JDK_HOME/jre/lib/security avec portecle. Le mot de passe sera 'changeit'. Ajouter les certificats de serveur comme "approuvés"

Maintenant, la construction du chemin PKIX ayant échoué disparaîtra. Sinon, vérifiez les certificats et le JDK que vous utilisez.

2
pedrofb

En utilisant RestAssured 3.0, j’ai pris le code de @ rohitkadam19 et je l’ai fait fonctionner ainsi:

@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();
    }
}
2
Jacques Koorts

Le code mentionné ci-dessous ne fonctionne que,

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);
}
1
forkdbloke