4
我有一個來自REST服務提供者的證書,並且我需要告訴給定的HTTP獲取調用以在聯繫給定提供者時使用它。我正在使用的代碼庫使用第三方庫來實現這一點,但我想利用WS.url調用的超時特性和細節。Play Framework:如何使用給定的certifcate進行HTTP WS.url調用?
我看了一下API文檔和網站上的文檔,我只發現了一些線索,而這些線索迄今爲止並沒有讓我找到任何解決方案。
我有一個來自REST服務提供者的證書,並且我需要告訴給定的HTTP獲取調用以在聯繫給定提供者時使用它。我正在使用的代碼庫使用第三方庫來實現這一點,但我想利用WS.url調用的超時特性和細節。Play Framework:如何使用給定的certifcate進行HTTP WS.url調用?
我看了一下API文檔和網站上的文檔,我只發現了一些線索,而這些線索迄今爲止並沒有讓我找到任何解決方案。
你應該可以通過修改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庫。
這黯然失敗: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
我編輯了我的答案。看起來像通過init方法更新SSLContext是不可能的。因此創建一個新客戶可能是一種解決問題的方法。現在能進一步幫助你嗎? – brazo
這與我最終做的事情很接近,基本上我把遊戲實現複製到我自己的庫空間中,並以類似的方式調整它。感覺很不理想,也許我應該考慮爲這個框架寫一個更新? – PlexQ