如何使用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/");
- 确保您已将证书添加到您的信任存储区,如下所示:
keytool -import -trustcacerts -keystore {JAVA_HOME} / jre / lib / security / cacerts -noprompt -alias -file {CORRECT_PATH} /what_ever.crt
- 如果问题仍然存在,请通过在执行命令行中设置java参数来直接设置路径,如下所示:
-Djavax.net.ssl.trustStore = {JAVA_HOME} / JRE / LIB /安全/ cacerts中