Я включил https в tomcat и у меня есть самозаверяющий сертификат для аутентификации сервера.Я создал http-клиент, используя Apache httpClient.Я установил доверительный менеджер, загружающий сертификат сервера.Http-клиент может без проблем подключиться к серверу.Чтобы увидеть, что происходит, я включил отладку:
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: EMAILADDRESS=info@valicert.com, CN=http://www.valicert.com/, OU=ValiCert Class 1 Policy Validation Authority, O="ValiCert, Inc.", L=ValiCert Validation Network
Issuer: EMAILADDRESS=info@valicert.com, 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
Кажется, что он также использует хранилище доверенных сертификатов по умолчанию!Мой вопрос: почему это происходит?
В своем коде я явно указываю конкретное хранилище доверия для использования (через truststoremanagers).Я ожидал, что будет использовано только это.Похоже, что и мое хранилище доверенных сертификатов, и java по умолчанию используются.Это как это должно работать?
ОБНОВЛЕНИЕ:
Я попробовал следующее:
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: Как вы видите в коде ниже, я указываю свое хранилище ключей. Я ожидаю, что следует использовать только это (не это и 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);
Не имеет смысла для меня.