На работе мы недавно добавили опцию аутентификации связи между машиной и машиной с использованием клиентских сертификатов (двусторонняя ssl). Хотя это было относительно легко настроить и получить программный доступ с разных языков программирования, мы столкнулись с некоторыми трудностями при запуске и запуске нашего интеграционного теста. Мы хотели провести пару тестов, чтобы убедиться, что информация из сертификата была правильно проанализирована и сопоставлена с внутренним идентификатором клиента, и как система реагирует на недействительные сертификаты и пару других пограничных случаев.
Поскольку мы используем Scalatest для всех наших интеграционных тестов, мы просто хотели добавить хранилище личных ключей и хранилище доверия для масштабирования и покончить с этим. Тем не менее, стандартный свободный API, предоставляемый Scalatest, не предлагает его (или мы не смогли его найти). После некоторого осмотра мы пришли к следующей настройке, которая работает для нас в нашем наборе интеграционных тестов:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
import java.io.{File, FileInputStream}import java.security.KeyStoreimport com.jayway.restassured.RestAssuredimport com.jayway.restassured.config.SSLConfigimport com.jayway.restassured.http.ContentTypeimport com.jayway.restassured.response.Responseimport org.apache.http.conn.ssl.{SSLConnectionSocketFactory, SSLSocketFactory}import org.scalatest._object SSLTest { def doSSLTest() = { // load the corresponding keystores val privateKeyStoreLocation = new FileInputStream(new File("src/test/resources/keystores/testing-client.p12")); val keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(privateKeyStoreLocation, "secret".toCharArray()); val certKeyStoreLocation = new FileInputStream(new File("src/test/resources/keystores/ca-chain.cert.jks")); val trustStore = KeyStore.getInstance("jks"); trustStore.load(certKeyStoreLocation, "secret".toCharArray()); // manually create a new sockerfactory and pass in the required values val clientAuthFactory = new org.apache.http.conn.ssl.SSLSocketFactory(keyStore, "secret", trustStore); // don't check on hostname clientAuthFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); // set the config in rest assured val config = new SSLConfig().`with`().sslSocketFactory(clientAuthFactory).and().allowAllHostnames(); RestAssured.config = RestAssured.config().sslConfig(config); RestAssured .given.contentType(ContentType.JSON) .when .request }} |
Обратите внимание, что некоторые из этих классов фактически устарели и могут быть заменены другими соответствующими классами из библиотеки Apache Commons, используемой здесь.
| Ссылка: | Двусторонний SSL (клиентские сертификаты) с Scalatest от нашего партнера JCG Йоса Дирксена в блоге Smart Java . |