有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在SSL中使用Play WS?

我的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使用此证书建立安全连接

要明确的是,这不是一个游戏应用程序


共 (3) 个答案

  1. # 1 楼答案

    直接使用WS是不可能的Play docs says:“WS不支持客户端证书(也称为相互TLS/MTLS/客户端身份验证)。您应该直接在AsyncHttpClientConfig的实例中设置SSLContext,并设置适当的密钥库和信任库。”

    也许你可以这样做:

    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);
    
  2. # 2 楼答案

    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/security/cacerts

  3. # 3 楼答案

    您想要使用解析器。有关配置的详细信息,请参见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/");