5
A
回答
7
原來,您可以指定特定的證書用於特定的URL提取;實質上,您需要創建自己的TrustManager並將其交換,如下所示:
public String fetchFromUrl(String urlString) throws IOException {
URL url = new URL(urlString);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection && shouldSubstituteCert(url)) {
HttpsURLConnection sslConn = (HttpsURLConnection) conn;
try {
SSLContext context = SSLContext.getInstance("SSL");
context.init(null, new TrustManager[] {new MyTrustManager()}, null);
sslConn.setSSLSocketFactory(context.getSocketFactory());
} catch (Exception e) {
e.printStackTrace();
throw new IOException("Error creating custom keystore", e);
}
}
return readAll(conn.getInputStream());
}
private static class MyTrustManager implements X509TrustManager {
private final X509TrustManager trustManager;
public MyTrustManager() throws
KeyStoreException, NoSuchAlgorithmException,
CertificateException, IOException {
// Load a KeyStore with only our certificate
KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType());
store.load(null, null);
Certificate cert = loadPemCert();
store.setCertificateEntry("me.com", cert);
// create a TrustManager using our KeyStore
TrustManagerFactory factory = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
factory.init(store);
this.trustManager = getX509TrustManager(factory.getTrustManagers());
}
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
trustManager.checkClientTrusted(chain, authType);
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
trustManager.checkServerTrusted(chain, authType);
}
public X509Certificate[] getAcceptedIssuers() {
return trustManager.getAcceptedIssuers();
}
private static X509TrustManager getX509TrustManager(TrustManager[] managers) {
for (TrustManager tm : managers) {
if (tm instanceof X509TrustManager) {
return (X509TrustManager) tm;
}
}
return null;
}
private Certificate loadPemCert()
throws CertificateException, IOException {
InputStream stream =
this.getClass().getClassLoader().getResourceAsStream("cert.pem");
CertificateFactory factory = CertificateFactory.getInstance("X.509");
return factory.generateCertificate(stream);
}
}
相關問題
- 1. WebSphere:我可以在不重新啓動jvm的情況下重新加載事務設置嗎?
- 2. 向Java密鑰庫,JVM導入證書會忽略新證書
- 3. 我可以在不重新啓動我的項目的情況下添加servlet
- 4. nginx - 我可以在不重新啓動服務器的情況下添加新的虛擬主機嗎?
- 5. 在不重新啓動xterm的情況下重新加載.Xresources
- 6. 在不重新啓動Xorg的情況下重新加載XINITRC
- 7. 我可以在沒有JVM重啓的情況下重新加載JavaFX 8中的樣式表嗎?
- 8. 我們可以在密鑰庫中加載多個證書和密鑰嗎?
- 9. NodeJS:在不重新啓動的情況下向Socket.IO服務器添加通道
- 10. 我可以在不重定向的情況下重寫URL嗎?
- 11. 可以在不重新啓動R的情況下卸載Rcpp包DLL嗎?
- 12. 在哪種情況下,JVM將重新啓動
- 13. 我們可以在不重新啓動solr的情況下更新solc索引和模式在multiplecore內嗎?
- 14. 我可以在不使用xterm的情況下啓動clisp嗎?
- 15. 我可以在不重新啓動Jetty服務器的情況下更新應用程序配置文件嗎?
- 16. 在這種情況下,我可以重新使用指針嗎?
- 17. 如何在不重新啓動的情況下「重新啓動」Internet Explorer服務
- 18. 在不重新啓動lighty的情況下更新.po文件
- 19. 我可以向Firebase數據庫添加密鑰嗎?
- 20. c#在不重新啓動的情況下添加/刪除動態插件
- 21. 如何在不重新啓動的情況下重新加載JProfiler許可證服務器的users.txt文件?
- 22. 是否可以在不重新啓動進程的情況下重新啓動Azure Web角色上的IIS?
- 23. 向Github重新添加密鑰
- 24. 無需重新啓動Firefox即可刷新密鑰庫
- 25. 在不重新啓動活動的情況下恢復活動
- 26. 在不重新啓動進程的情況下更新共享庫
- 27. 是否可以在不重新啓動Django的情況下重新加載視圖?
- 28. 是否可以在不重新啓動的情況下應用vim配置?
- 29. 我可以在不重新發布的情況下更改POST值的值嗎?
- 30. 我可以添加功能對重複密鑰更新