В процессе использования клиентских сертификатов для аутентификации я решил использовать not-Пока-commons-ssl-0.3.11.jar . Это привело к другой проблеме - простой акт вызова конструктора для EasySSLProtocolSocketFactory
или StrictSSLProtocolSocketFactory
приведет к исключению.
Код, выделенный в простом приложении cmd line:
public class CertTest {
public static void main(String[] args) {
System.setProperty("javax.net.debug", "ssl,handshake"); // SSL DEBUG INFO
String keystore = "/usr/java/jdk1.6.0_11/jre/lib/security/cacerts";
String keystorePassword = "changeit";
System.setProperty("javax.net.ssl.keyStore", keystore);
System.setProperty("javax.net.ssl.keyStorePassword", keystorePassword);
// System.setProperty("javax.net.ssl.trustStore", keystore);
// System.setProperty("javax.net.ssl.trustStorePassword", keystorePassword);
try {
org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory factory =
new org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory();
}
catch (Exception e) {
System.out.println (e);
}
}
}
Чтобы изолировать проблемы со старыми библиотеками, я поместил приведенный выше код в каталог с этими jar-файлами (это ЕДИНСТВЕННЫЕ jar-файлы в classpath):
- HttpClient-4.0.1.jar
- пока еще не Обще-SSL-0.3.11.jar
- Обще-HttpClient-3.1.jar
- httpcore-4.0.1.jar
Итак, с некоторыми клиентскими сертификатами в хранилище ключей cacerts
я получаю:
org.apache.commons.ssl.ProbablyBadPasswordException: Probably bad JKS-Key password: java.security.UnrecoverableKeyException: Password must not be null
Если я использую keytool
для удаления всех клиентских сертификатов, которые я загрузил, исключение изменится на
** Причина: java.security.KeyStoreException: закрытые ключи не найдены в хранилище ключей! **
на org.apache.commons.ssl.KeyStoreBuilder.validate (KeyStoreBuilder.java:269)
в org.apache.commons.ssl.KeyStoreBuilder.build (KeyStoreBuilder.java:129)
на org.apache.commons.ssl.KeyMaterial. (KeyMaterial.java:179)
на org.apache.commons.ssl.KeyMaterial. (KeyMaterial.java:170)
atg.apache.commons.ssl.KeyMaterial. (KeyMaterial.java:160)
atg.apache.commons.ssl.KeyMaterial. (KeyMaterial.java:64)
на org.apache.commons.ssl.KeyMaterial. (KeyMaterial.java:114)
atg.apache.commons.ssl.KeyMaterial. (KeyMaterial.java:89)
на org.apache.commons.ssl.SSL. (SSL.java:142)
на org.apache.commons.ssl.SSLClient. (SSLClient.java:59)
в org.apache.commons.ssl.HttpSecureProtocol. (HttpSecureProtocol.java:55)
в org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory. (EasySSLProtocolSocketFactory.java:94)
Фрагменты на выходе:
Хранилище ключей: /usr/java/jdk1.6.0_11/jre/lib/security/cacerts
Тип хранилища ключей: jks
Поставщик хранилища ключей:
хранилище ключей инициализации
init keymanager типа SunX509
trustStore: /usr/java/jdk1.6.0_11/jre/lib/security/cacerts
Тип доверенного хранилища: jks
Поставщик trustStore:
init truststore
добавив в качестве доверенного сертификата:
Тема: CN = SwissSign Platinum CA - G2, O = SwissSign AG, C = CH
Эмитент: CN = SwissSign Platinum CA - G2, O = SwissSign AG, C = CH
Алгоритм: RSA; Серийный номер: 0x4eb200670c035d4f
целая куча доверенных сертификатов по умолчанию отсечена здесь ...
вызвать посев SecureRandom
готовый посев SecureRandom
@@@@@@@@@@ ИСКЛЮЧЕНИЕ
java.security.KeyStoreException: закрытые ключи не найдены в хранилище ключей!
Есть идеи?