День добрый!
Задача параллельно получать ресурсы с ресурсов, с использованием ГОСТ-алгоритмов и "традиционных".
Для работы с внешними ресурсами установил CryptoPro CSP + скачал и установил сертификаты
http://cpca20.cryptopro.ru/cacer.p7b (они встали в доверенные корневые центры сертификации). Контрольный IE благополучно открывает (например -
https://icrs.nbki.ru/main/ у которого сертификат выданный УЦ Крипто-Про (Гост 2012)).
Использую JDK8, Установил JCP -> Запускаю JCPControlPanel->Хранилище ключей и сертификатов->Хранилище сертификатов->Создаю новое хранилище->Добавляю в него скачанный с
http://cpca20.cryptopro.ru/cacer.p7b и получаю цепочку из 5 сертификатов (УЦ КРИПТО-ПРО с разными алгоритмами подписи). Использую немного модернизированный пример из JTLS_Samples:
Код:String trustStorePath = "C:/s/2/storage.store";
String trustStorePassword = "11112222";
String urlPath = "https://icrs.nbki.ru/main/";//"https://www.google.com";
System.setProperty("com.sun.security.enableCRLDP", "true");
System.setProperty("com.ibm.security.enableCRLDP", "true");
SSLSocketFactory factory = TLSContext.initClientSSL(null, trustStorePath, trustStorePassword, null);
URL url = new URL(urlPath);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setSSLSocketFactory(factory);
BufferedReader br = new BufferedReader(new InputStreamReader( connection.getInputStream(), "windows-1251"));
String input;
while ((input = br.readLine()) != null)
System.out.println(input);
br.close();
connection.disconnect();
https://icrs.nbki.ru/main/ открывается, но даже добавив в тоже хранилище сертификаты GlobalSignRootCA-R2 (или всю цепочку непосредственно, например до google.com) - открыть
https://www.google.com не получается, ошибка javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure:
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl init.
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: trigger seeding of SecureRandom
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: done seeding SecureRandom
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl initialized.
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl$DefaultSSLContext l
INFO: keyStore is :
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl$DefaultSSLContext l
INFO: keyStore type is :
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl$DefaultSSLContext l
INFO: keyStore provider is :
авг 23, 2019 2:39:55 PM ru.CryptoPro.ssl.SSLContextImpl$DefaultSSLContext l
INFO: init keystore
авг 23, 2019 2:39:56 PM ru.CryptoPro.JCP.tools.Starter check
INFO: Loading JCP 2.0.40424
авг 23, 2019 2:39:56 PM ru.CryptoPro.JCP.tools.Starter check
INFO: JCP loaded.
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.SSLContextImpl$DefaultSSLContext l
INFO: init keymanager of type GostX509
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.cl_38 <init>
WARNING: %% No appropriate keys for handshake
PATH: C:\Users\886\Local Settings\Application Data\Crypto Pro
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore is : No File Available, using empty keystore.
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore type is : CertStore
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: trustStore provider is :
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.TrustManagerFactoryImpl a
INFO: init truststore
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl init.
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: trigger seeding of SecureRandom
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: done seeding SecureRandom
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.SSLContextImpl engineInit
INFO: SSLContextImpl initialized.
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.SSLContextImpl$DefaultSSLContext <init>
INFO: DefaultSSLContext initialized.
авг 23, 2019 2:39:56 PM ru.CryptoPro.ssl.SSLSocketImpl a
WARNING: main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
Exception in thread "main" javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at ru.CryptoPro.ssl.cl_2.a(Unknown Source)
at ru.CryptoPro.ssl.cl_2.a(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.b(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.a(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.n(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.b(Unknown Source)
at ru.CryptoPro.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1564)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1492)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:263)
at cms.ClientSample.main(ClientSample.java:41)
Process finished with exit code 1
"Прямое" использованиев виде
Код:URL url = new URL("https://www.google.com/");
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
Которое до установки JCP корректно выполнялось, вызывает ту же ошибку.
Что необходимо дополнительно инициализировать для переключения между подобными разными запросами (KeyManager?)?
Есть ли пример с инициализацией всех необходимых составляющих для https соединений?
Заранее спасибо.