我在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