Проблема с 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 шт):
Если вдруг кто-то столкнется с похожей проблемой, то вот решение. У вас обязательно должно быть 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());
}
}