Проблема с SSL аутентификацией через сертификат в Rest Assured

Всем привет, возникает проблема, бьюсь уже несколько дней - как установить SSL соединение через Rest Assured? Вот мои попытки, но с таким кодом:

public class ApiTests {
    @BeforeAll
    static void setUp() {
        RestAssured.baseURI = "my host";
    }

    @Test
    void createUserTest() throws Exception {
        KeyStore keyStore = KeyStore.getInstance("PKCS12");
        String keyStorePass = "my pass";
        try (FileInputStream fis = new FileInputStream("D:\\Idea_projects\\TestApi\\src\\test\\resources\\my_cert.p12")) {
            keyStore.load(fis, keyStorePass.toCharArray());
        }

        given()
                .keyStore(keyStore)
                .trustStore("C:\\Program Files\\Java\\jdk-11.0.13\\lib\\security\\cacerts", "changeit")
                .contentType(JSON)
                .when()
                .post("users")
                .then()
                .statusCode(200)
                .body("name", is("Valentin"))
                .body("job", is("qa"));
    }
}

Возникает ошибка:

No signature of method: io.restassured.config.SSLConfig.keyStore() is applicable for argument types: (java.security.KeyStore) values: [java.security.KeyStore@504497fa]
Possible solutions: keyStore(java.lang.String), keyStore(java.io.File, java.lang.String), keyStore(java.lang.String, java.lang.String), getKeyStore(), trustStore(java.security.KeyStore)
groovy.lang.MissingMethodException: No signature of method: io.restassured.config.SSLConfig.keyStore() is applicable for argument types: (java.security.KeyStore) values: [java.security.KeyStore@504497fa]
Possible solutions: keyStore(java.lang.String), keyStore(java.io.File, java.lang.String), keyStore(java.lang.String, java.lang.String), getKeyStore(), trustStore(java.security.KeyStore)

Пробовал использовать relaxedHTTPSValidation(), но с ним ругается на:

Received fatal alert: bad_certificate
javax.net.ssl.SSLHandshakeException: Received fatal alert: bad_certificate

Т.е. как я понимаю, всё равно нужно как-то добавить сертификат, но как? Ума не приложу уже. Возможно, мой код вообще неправильный и нужно как-то по другому работать с сертификатом? Если кто-то знает, помогите пожалуйста, уже на грани отчаяния.


Ответы (1 шт):

Автор решения: Valentin

Если вдруг кто-то столкнется с похожей проблемой, то вот решение. У вас обязательно должно быть 2 сертификата: серверный и клиентский. Затем серверный помещаете в хранилище cacerts в Java с командой:

keytool -importcert -storetype PKCS12 -keystore trustStore.p12 -storepass тутпасс-alias mpzCA -file root.crt -noprompt

Затем, в коде делаете как ниже:

public class DealerProtocolTests {

    @Test
    void sendDealerRequest() throws Exception {
        RestAssured.config = RestAssured.config().sslConfig(
                new SSLConfig()
                        .trustStore("src/test/resources/certificate/trustStore.p12", "pass")
                        .keyStore("src/test/resources/certificate/mpz_test_new.p12", "pass"));

        Response response = null;
         response =
                given()
                        .config(config)
                        .spec(xmlSpec)
                        .basePath("/xmlInteface")
                        .body("")
                        .when()
                        .get()
                        .then()
                        .statusCode(200)
                        .log().all()
                        .extract().response();

        System.out.println(response.prettyPrint());
    }
}
→ Ссылка