Статьи

Двусторонний SSL (клиентские сертификаты) с Scalatest

На работе мы недавно добавили опцию аутентификации связи между машиной и машиной с использованием клиентских сертификатов (двусторонняя 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
      .post("https://theurl")
  }
 
 
 
}

Обратите внимание, что некоторые из этих классов фактически устарели и могут быть заменены другими соответствующими классами из библиотеки Apache Commons, используемой здесь.

Ссылка: Двусторонний SSL (клиентские сертификаты) с Scalatest от нашего партнера JCG Йоса Дирксена в блоге Smart Java .