我在tomcat中啓用了https併爲服務器認證擁有一個自簽名證書。我使用Apache httpClient創建了一個http客戶端。我已經設置了一個加載服務器證書的信任管理器。 http客戶端可以連接服務器沒有問題。要查看是怎麼回事我啓用調試:使用Apache httpclient進行https https
System.setProperty("javax.net.debug", "ssl");
我看到了,我無法理解在所有的情況如下:
***
adding as trusted cert:
Subject: CN=Me, OU=MyHouse, O=Home, L=X, ST=X, C=BB
Issuer: CN=Me, OU=MyHouse, O=Home, L=X, ST=X, C=BB
Algorithm: RSA; Serial number: 0x4d72356b
Valid from Sat Mar 05 15:06:51 EET 2011 until Fri Jun 03 16:06:51 EEST 2011
我的證書顯示,並添加到信任庫(因爲我看到) 。然後:
trigger seeding of SecureRandom
done seeding SecureRandom
這裏是部分來自調試跟蹤我不明白:
trustStore is: C:\Program Files\Java\jre6\lib\security\cacerts
trustStore type is : jks
trustStore provider is :
init truststore
adding as trusted cert:
Subject: CN=SwissSign Platinum CA - G2, O=SwissSign AG, C=CH
Issuer: CN=SwissSign Platinum CA - G2, O=SwissSign AG, C=CH
Algorithm: RSA; Serial number: 0x4eb200670c035d4f
Valid from Wed Oct 25 11:36:00 EEST 2006 until Sat Oct 25 11:36:00 EEST 2036
adding as trusted cert:
Subject: [email protected], CN=http://www.valicert.com/, OU=ValiCert Class 1 Policy Validation Authority, O="ValiCert, Inc.", L=ValiCert Validation Network
Issuer: [email protected], CN=http://www.valicert.com/, OU=ValiCert Class 1 Policy Validation Authority, O="ValiCert, Inc.", L=ValiCert Validation Network
Algorithm: RSA; Serial number: 0x1
Valid from Sat Jun 26 01:23:48 EEST 1999 until Wed Jun 26 01:23:48 EEST 2019
看來,它也採用了默認的Java信任庫!我的問題是爲什麼會發生這種情況?
在我的代碼中,我明確指定要使用的特定信任存儲(通過truststoremanagers)。我期待只有這個被使用。似乎我的truststore和java的默認都被使用了。這是應該如何工作?
UPDATE:
我試過如下:
System.out.println("TMF No:"+tmf.getTrustManagers().length);
System.out.println("Class is "+tmf.getTrustManagers()[0].getClass().getName());
我想,我應該看到2個信任管理器,因爲2個密鑰庫(我和Java的默認顯示使用)。
但結果只有1個信任管理器!
TMF No:1
Class is com.sun.net.ssl.internal.ssl.X509TrustManagerImpl
UPDATE2:正如你在代碼中看到波紋管我指定我keystore.My意料的是,這僅應使用(不是這個和 CACERT以及)
HttpClient client = new DefaultHttpClient();
SSLContext sslContext = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
KeyStore ks = KeyStore.getInstance("JKS");
File trustFile = new File("clientTrustStore.jks");
ks.load(new FileInputStream(trustFile), null);
tmf.init(ks);
sslContext.init(null, tmf.getTrustManagers(),null);
SSLSocketFactory sf = new SSLSocketFactory(sslContext);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Scheme scheme = new Scheme("https", sf, 443);
client.getConnectionManager().getSchemeRegistry().register(scheme);
httpGet = new HttpGet("https://localhost:8443/myApp");
HttpResponse httpResponse = client.execute(httpGet);
不對我來說沒有意義。
這是一個很好的測試。感謝您的幫助 – Cratylus 2011-03-09 20:52:57
嗨Oleg,我面臨類似的問題,但只有當我發送POST請求,而不是通過GET。任何見解? – Abhishek 2011-05-09 06:45:48
那麼,在這個地方是否存在一個可以追蹤解決方案的bug? – pulkitsinghal 2013-01-08 17:20:17