在工作中,我们最近添加了使用客户端证书(双向ssl)对计算机到计算机通信进行身份验证的选项。 虽然这相对容易设置,并且可以通过不同的编程语言进行编程访问,但是在集成测试的启动和运行方面遇到了一些困难。 我们希望进行一些测试,以确保正确解析了证书中的信息并将其映射到内部客户端ID,以及系统如何对无效证书和其他一些边缘情况做出反应。
由于我们将Scalatest用于所有集成测试,因此我们只想将私有密钥库和信任库添加到scalatest并完成它。 但是,Scalatest提供的标准fluent API没有提供它(或者我们找不到)。 环顾四周后,我们来到了以下设置,该设置适用于我们的集成测试套件:
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库中的其他相关类替换。
翻译自: https://www.javacodegeeks.com/2015/11/two-way-ssl-client-certificates-with-scalatest.html