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. 我可以在不重新啓動我的項目的情況下添加servlet
- 2. 在不重新啓動Xorg的情況下重新加載XINITRC
- 3. 我可以在沒有JVM重啓的情況下重新加載JavaFX 8中的樣式表嗎?
- 4. 我們可以在密鑰庫中加載多個證書和密鑰嗎?
- 5. 我可以在不重定向的情況下重寫URL嗎?
- 6. 我可以在不重新啓動Jetty服務器的情況下更新應用程序配置文件嗎?
- 7. 如何在不重新啓動的情況下「重新啓動」Internet Explorer服務
- 8. 在不重新啓動lighty的情況下更新.po文件
- 9. c#在不重新啓動的情況下添加/刪除動態插件
- 10. 如何在不重新啓動的情況下重新加載JProfiler許可證服務器的users.txt文件?
- 11. 我可以向Firebase數據庫添加密鑰嗎?
- 12. 是否可以在不重新啓動進程的情況下重新啓動Azure Web角色上的IIS?
- 13. 向Github重新添加密鑰
- 14. 無需重新啓動Firefox即可刷新密鑰庫
- 15. 在不重新啓動活動的情況下恢復活動
- 16. 在不重新啓動進程的情況下更新共享庫
- 17. 是否可以在不重新啓動Django的情況下重新加載視圖?
- 18. 是否可以在不重新啓動的情況下應用vim配置?
- 19. 我可以在不重新發布的情況下更改POST值的值嗎?
- 20. Solr是否可以在不重新啓動Solr的情況下加載新的log4j.properties配置文件?
- 21. 我們可以在不重新啓動黑莓模擬器的情況下看到代碼更改嗎?
- 22. pgbouncer可以在不重啓的情況下重新讀取/ etc/hosts文件
- 23. 在不重新啓動服務的情況下更改jobcron
- 24. 在不重新啓動的情況下應用vimrc更改
- 25. 我可以在不破壞和添加新項目的情況下更新ObservableCollection <T>中的值嗎?
- 26. 我可以在真實設備(iPod)上沒有證書的情況下啓動我的應用程序嗎?
- 27. 在某些情況下,我可以永遠防止重新啓動我的節點腳本嗎?
- 28. 是否可以在不刷新窗口的情況下進行「密碼」驗證?
- 29. 如何在不重新啓動我的Web應用程序的情況下重新加載servlet類?
- 30. 如何在啓用身份驗證的情況下重新啓動MySQL Fabric?