有沒有辦法在請求後使用Apache HttpClient獲取經過身份驗證的服務器的SSL證書 - 僅僅是服務器端的request.getAttribute(「javax.servlet.request.X509Certificate」)的對應部分?Apache HttpClient獲取服務器證書
3
A
回答
3
好的,這在某些方面有些偏袒,我希望這樣做的方式可以與任何連接管理器一起工作。我假設你正在運行最新的HttpClient(4.2)
所以,你將不得不做的是添加一個HttpResponseInterceptor到客戶端。
((AbstractHttpClient)client).addResponseInterceptor(new HttpResponseInterceptor() {
@Override
public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
HttpRoutedConnection routedConnection= (HttpRoutedConnection)context.getAttribute(ExecutionContext.HTTP_CONNECTION);
if(routedConnection.isSecure()) {
Certificate[] certificates= routedConnection.getSSLSession().getPeerCertificates();
// Assume that PEER_CERTIFICATES is a constant you've defined
context.setAttribute(PEER_CERTIFICATES, certificates);
}
}
});
一旦做到這一點,通過這個客戶端所做的任何請求將檢查是否連接被標記爲「安全」,然後嘗試獲得對等證書。
在這個例子中,我只是放入與對等連接關聯的整個證書數組。
在這一點上,執行你會做類似如下的內容:
HttpContext context= new BasicHttpContext();
HttpGet get= new HttpGet(....);
client.execute(get, context);
// should contain the array of Certificate - these are more likely X509Certificate instances
Certificate[] peerCertificates= (Certificate[])context.getAttribute(PEER_CERTIFICATES);certificates
// do whatever logic to complete and consume the request
希望這會得到你所需要的 - 如果任何人有超越這一點,他們會理解的建議。
編輯這也可以作爲HttpRequestInterceptor完成,並且具有與連接已建立相同的效果。
1
對於HttpClient的4.5解決方案需要這樣的改變:
clientBuilder.addInterceptorLast(new HttpResponseInterceptor() {
@Override
public void process(HttpResponse response, HttpContext context) throws HttpException, IOException {
ManagedHttpClientConnection routedConnection = (ManagedHttpClientConnection) context.getAttribute(HttpCoreContext.HTTP_CONNECTION);
SSLSession sslSession = routedConnection.getSSLSession();
if (sslSession != null) {
Certificate[] certificates = sslSession.getPeerCertificates();
// Assume that PEER_CERTIFICATES is a constant you've defined
context.setAttribute(PEER_CERTIFICATES, certificates);
}
}
});
相關問題
- 1. Apache HttpClient自簽名證書
- 2. Open SSL從服務器獲取證書
- 3. Apache HttpClient和PEM證書文件
- 4. 如何從服務證書庫中獲取證書.net 4
- 5. JAVA:提取服務器證書
- 6. RSA服務器證書apache2
- 7. 如何從服務器獲取機器名稱SSL證書
- 8. 在NodeJS中從服務器端證書獲取服務器的DN
- 9. Android httpClient服務器身份驗證
- 10. 有沒有辦法使用Apache的HttpClient獲取網站的證書?
- 11. 使用C#獲取SMTP服務器證書
- 12. 無法從網站獲取服務器證書
- 13. 從命令行獲取HTTPS服務器的證書指紋?
- 14. 從具有顯式SSL/TLS的ftps服務器獲取證書
- 15. 如何從java中的服務器證書獲取OCSP url?
- 16. Android ICS:獲取HttpsUrlConnection服務器證書的問題
- 17. 如何在Go HTTPS服務器中獲取客戶端證書
- 18. 在Windows 7上獲取HTTPS服務器的證書指紋?
- 19. 使用Python獲取smtp服務器證書
- 20. 從outlook imap服務器獲取offlineimap的正確證書信息
- 21. C#獲取SMTP-服務器的SSL證書有效期從ServerCertificateValidationCallback
- 22. 在Servlet中獲取服務器證書/ SSL
- 23. 使用客戶端證書獲取SOAP服務器WSDL文件
- 24. 通過SSL連接到SQL Server並獲取服務器證書
- 25. 具有HTTPS證書的HttpClient
- 26. Urllib和服務器證書的驗證
- 27. Delphi Indy驗證服務器證書SSL
- 28. 驗證服務器證書OpenSSL
- 29. 服務器證書驗證失敗
- 30. 驗證證書TLS/SSL服務器
太好了,謝謝。 – mtraut