Подключение к cloudant из Java с использованием TLSv1.2 - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь подключиться к своей базе данных Cloudant из Java, используя TLSv1.2 с сервера Liberty, на котором работает IBM JRE.

Поддержка подключения ниже TLSv1.2 заканчивается, и мне нужно, чтобы это работало.

Я добавил customSSLSocketFactory в компоновщик, сконфигурированный для связи TLSv1.2, когда я запускаю его в своей локальной среде, которая работает на Oracle JRE, ошибки нет, но когда я запускаю его в более новой среде, котораязапускает сервер Liberty с IBM JRE (последние версии Java 8) Я получаю сообщение об ошибке.

SSLSocketFactory sslSocketFactory; 
try {
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init((KeyStore) null);
    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
    if (trustManagers.length != 1 || !(trustManagers[0] instanceof X509TrustManager)) {
        throw new IllegalStateException("Unexpected default trust managers:" + Arrays.toString(trustManagers));
    }
    X509TrustManager trustManager = (X509TrustManager) trustManagers[0];

    SSLContext ssl = SSLContext.getInstance("TLSv1.2");
    ssl.init(null, new TrustManager[] { trustManager }, new SecureRandom());
    sslSocketFactory = ssl.getSocketFactory();
} catch (GeneralSecurityException e) {
    throw new RuntimeException(e);
}

client = ClientBuilder.url(new URL(restServerURL)).username(userid)
         .password(password).connectTimeout(60, TimeUnit.SECONDS).customSSLSocketFactory(sslSocketFactory)
         .build();

Получена ошибка:

R java.lang.IllegalStateException: Unable to extract the trust manager on okhttp3.internal.platform.Platform@5194035f, sslSocketFactory is class com.ibm.jsse2.SSLSocketFactoryImpl
R   at okhttp3.OkHttpClient$Builder.sslSocketFactory(OkHttpClient.java:654)
R   at okhttp3.internal.huc.OkHttpsURLConnection.setSSLSocketFactory(OkHttpsURLConnection.java:63)
R   at com.cloudant.http.internal.interceptors.SSLCustomizerInterceptor.interceptRequest(SSLCustomizerInterceptor.java:71)
R   at com.cloudant.http.HttpConnection.execute(HttpConnection.java:290)
R   at com.cloudant.client.org.lightcouch.CouchDbClient.execute(CouchDbClient.java:485)
R   at com.cloudant.client.api.CloudantClient.executeRequest(CloudantClient.java:339)
R   at com.cloudant.client.internal.views.ViewRequester.executeRequestWithResponseAsJson(ViewRequester.java:34)
R   at com.cloudant.client.internal.views.ViewRequester.getResponseAsJson(ViewRequester.java:28)
R   at com.cloudant.client.internal.views.ViewRequestImpl.getResponse(ViewRequestImpl.java:34)
R   at com.profility.database.cloudant.CloudantConnector.getQuestionnaire(CloudantConnector.java:470)
R   at com.profility.database.Database.getQuestionnaire(Database.java:159)
R   at com.profility.questionnaire.QuestionnaireCache.getTheQuestionnaire(QuestionnaireCache.java:21)
R   at com.profility.scheduer.ApplicationStarter.run(ApplicationStarter.java:31)
R   at java.lang.Thread.run(Thread.java:812)

1 Ответ

0 голосов
/ 31 мая 2019

Вам не нужен пользовательский SSLSocketFactory для использования TLS1.2, вам просто нужно настроить JVM для предоставления TLSv1.2.

Скорее всего, вам просто нужно свойство, как описано в этом документе поддержки com.ibm.jsse2.overrideDefaultTLS=true, чтобы соответствовать поведению Oracle и включить TLS 1.0, 1.1.и 1.2 (вместо значения по умолчанию всего 1.0).

Если этого недостаточно, вам могут потребоваться свойства, описанные в этом документе поддержки , чтобы включить протокол TLSv1.2 для протоколов.

...