2013-06-12 47 views
4

我有一個來自REST服務提供者的證書,並且我需要告訴給定的HTTP獲取調用以在聯繫給定提供者時使用它。我正在使用的代碼庫使用第三方庫來實現這一點,但我想利用WS.url調用的超時特性和細節。Play Framework:如何使用給定的certifcate進行HTTP WS.url調用?

我看了一下API文檔和網站上的文檔,我只發現了一些線索,而這些線索迄今爲止並沒有讓我找到任何解決方案。

回答

1

你應該可以通過修改AsyncHttpClient的SSLContext來實現它。 這個想法是提供底層客戶端的客戶端證書。我假設你有一個pkcs12飛來飛去。

看起來像AsyncHttpClientConfig無法更新,因爲它是自動初始化。因此,應該實例化和使用新的客戶端。

以下應該發送包含pkcs12文件的SSLContext所述的請求。

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory 
      .getDefaultAlgorithm()); 
    KeyStore clientCert = KeyStore.getInstance("pkcs12"); 
    InputStream is = new FileInputStream("/conf/brazo.p12"); 

    clientCert.load(is, "brazo".toCharArray()); 
    kmf.init(clientCert, "brazo".toCharArray()); 

    SSLContext sc = SSLContext.getInstance("TLSv1"); 
    sc.init(kmf.getKeyManagers(), null, 
      new SecureRandom()); 
    AsyncHttpClientConfig config = new AsyncHttpClientConfig.Builder().setSSLContext(sc).build(); 
    AsyncHttpClient client = new AsyncHttpClient(config); 

    String url = "https://your-url"; 
    Request req = new RequestBuilder().setUrl(url).setMethod("GET").build(); 
    client.executeRequest(req); 

不幸的是,這遠離了Play!標準WS庫。

+0

這黯然失敗:java.security.KeyManagementException: 所致默認的SSLContext在javax.net自動初始化 \t在sun.security.ssl.SSLContextImpl $ DefaultSSLContext.engineInit(SSLContextImpl.java:511) \t .ssl.SSLContext.init(SSLContext.java:283) \t at com.plexq.apiproxy.ApplicationContext $。 (ApplicationContext.scala:25) \t at com.plexq.apiproxy.ApplicationContext $。 (ApplicationContext.scala) \t ... 10更多 – PlexQ

+0

我編輯了我的答案。看起來像通過init方法更新SSLContext是不可能的。因此創建一個新客戶可能是一種解決問題的方法。現在能進一步幫助你嗎? – brazo

+0

這與我最終做的事情很接近,基本上我把遊戲實現複製到我自己的庫空間中,並以類似的方式調整它。感覺很不理想,也許我應該考慮爲這個框架寫一個更新? – PlexQ

相關問題