如何使用Play WS with SSL?

我的Java客户端应用程序需要执行REST调用。 我被指示使用Play的WS实现。 目前,我有这个:

AsyncHttpClientConfig.Builder builder = new com.ning.http.client.AsyncHttpClientConfig.Builder(); NingWSClient wsc = new play.libs.ws.ning.NingWSClient(builder.build()); WSRequestHolder holder = wsc.url("http://www.simpleweb.org/"); 

这很有效。 但是,我的应用程序需要访问使用SSL的安全Web服务。 我的客户有一个PKCS12证书。 如何让WS使用此证书建立安全连接?

需要说明的是,这不是Play应用程序。

它不可能直接与WS。 播放文档说 :“WS不支持客户端证书(也称为相互TLS / MTLS /客户端身份validation)。您应该直接在AsyncHttpClientConfig的实例中设置SSLContext并设置适当的KeyStore和TrustStore。”

你可以这样做:

 KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); KeyStore keyStore = KeyStore.getInstance("pkcs12"); InputStream inputStream = new FileInputStream("YOUR.p12"); keyStore.load(inputStream, "Your password as char[]"); keyManagerFactory.init(keyStore, "Your password as char[]"); SSLContext sslContext = SSLContext.getInstance("TLSv1.2"); sslContext.init(keyManagerFactory.getKeyManagers(), null,new SecureRandom()); AsyncHttpClientConfig httpClientConfig = new AsyncHttpClientConfig.Builder().setSSLContext(sslContext).build(); AsyncHttpClient httpClient = new AsyncHttpClient(httpClientConfig); 

您想使用解析器。 有关配置的详细信息,请参阅https://www.playframework.com/documentation/2.3.x/KeyStores 。

 val config = play.api.Configuration(ConfigFactory.parseString(""" |trustManager = { | stores = [ | { type: "pkcs12", path: "/path/to/pkcs12/file", password: "foo" } | ] |} """.stripMargin)) val parser = new DefaultSSLConfigParser(config, app.classloader) val sslConfig = parser.parse() val clientConfig = new DefaultWSClientConfig(sslConfig = sslConfig) val secureDefaults = new NingAsyncHttpClientConfigBuilder(clientConfig).build() val builder = new AsyncHttpClientConfig.Builder(secureDefaults) val wsc = new play.libs.ws.ning.NingWSClient(builder.build()); val holder = wsc.url("http://www.simpleweb.org/"); 
  1. 确保您已将证书添加到您的信任存储区,如下所示:

keytool -import -trustcacerts -keystore {JAVA_HOME} / jre / lib / security / cacerts -noprompt -alias -file {CORRECT_PATH} /what_ever.crt

  1. 如果问题仍然存在,请通过在执行命令行中设置java参数来直接设置路径,如下所示:

-Djavax.net.ssl.trustStore = {JAVA_HOME} / JRE / LIB /安全/ cacerts中