На работе мы недавно добавили опцию аутентификации связи между машиной и машиной с использованием клиентских сертификатов (двусторонняя 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.KeyStore import com.jayway.restassured.RestAssured import com.jayway.restassured.config.SSLConfig import com.jayway.restassured.http.ContentType import com.jayway.restassured.response.Response import 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 . |