OkHttpClient перенаправляет URL-адрес http на Https и выдает SSLException с URL-адресом https

Я получаю исключение ниже, в ответ на вызов службы https rest через OkHttpClient

Я использую библиотеку com.squareup.okhttp3:okhttp-ws:3.4.2.

Javax.net.ssl.SSLException: нераспознанное сообщение SSL, открытое текстовое соединение? at sun.security.ssl.InputRecord.handleUnknownRecord (неизвестный источник)

        File certFile = resourceLoader.getResource("classpath:" + certKey).getFile();
        try {
            sslContext = SSLContextBuilder.create()
                    .loadKeyMaterial(certFile, certKeyPassword.toCharArray(), certKeyPassword.toCharArray())
                    .loadTrustMaterial(certFile, certKeyPassword.toCharArray()).build();
        SSLSocketFactory sslSocketFactory = sslContext().getSocketFactory();
        RequestBody formBody = new FormBody.Builder()
                    .add("<key>", "<value>")
                    .build();
        OkHttpClient okHttpClient = new OkHttpClient.Builder().socketFactory(sslSocketFactory).build();
        Request request = new Request.Builder()
                    .url(https URL)
                    .post(formBody)
                    .addHeader("Content-Type", "application/json")
                    .build();
        LOG.info("Request passed: "+request);
        response = okHttpClient.newCall(request).execute();

Когда я использую URL-адрес http, он отправляет URL-адрес https взаимодействующему приложению. Но в журнале я также печатаю перед выполнением вызова, он показывает только URL-адрес http

Мне нужно заставить его работать с https URL.

Дайте мне знать, если потребуется какая-либо другая информация.

Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Что такое управление транзакциями JDBC и как оно используется для поддержания согласованности данных?
Управление транзакциями JDBC - это мощная функция, которая позволяет рассматривать группу операций с базой данных как единую единицу работы. Оно...
Выполнение HTTP-запроса с помощью Spring WebClient: GET
Выполнение HTTP-запроса с помощью Spring WebClient: GET
WebClient - это реактивный веб-клиент, представленный в Spring 5. Это реактивное, неблокирующее решение, работающее по протоколу HTTP/1.1.
Gradle за прокси-сервером
Gradle за прокси-сервером
Создайте проект Gradle под сетевым прокси.
1
0
544
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы случайно передаете sslSocketFactory в socketFactory.

OkHttpClient okHttpClient = new OkHttpClient.Builder().socketFactory(sslSocketFactory).build();

Вы хотите

OkHttpClient okHttpClient = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, trustManager).build();

Вы должны использовать действительно старую версию OkHttp, поскольку она специально проверяется в течение нескольких лет.

    /**
     * Sets the socket factory used to create connections. OkHttp only uses the parameterless
     * [SocketFactory.createSocket] method to create unconnected sockets. Overriding this method,
     * e. g., allows the socket to be bound to a specific local address.
     *
     * If unset, the [system-wide default][SocketFactory.getDefault] socket factory will be used.
     */
    fun socketFactory(socketFactory: SocketFactory) = apply {
      require(socketFactory !is SSLSocketFactory) { "socketFactory instanceof SSLSocketFactory" }

      if (socketFactory != this.socketFactory) {
        this.routeDatabase = null
      }

      this.socketFactory = socketFactory
    }

В более высокой среде я получаю ниже исключение java.net.UnknownHostException: <servicename>: временный сбой в разрешении имени

KJ21 22.12.2020 03:20

Я также добавил NoopHostNameVerifier, но все равно не повезло. return new OkHttpClient().newBuilder().sslSocketFactory(sslSocketFactor‌​y).hostnameVerifier(‌​NoopHostnameVerifier‌​.INSTANCE).build();

KJ21 22.12.2020 03:37

Спасибо Юрий. использование метода sslSocketFactory вместо метода socketFactory решило мою проблему, как показано ниже.

KJ21 07.02.2021 14:58

Этот метод устарел, поэтому странно, что вы выбрали его, он буквально не работает на некоторых платформах. Так что ваш код не будет переносимым.

Yuri Schimke 07.02.2021 15:09

Другие вопросы по теме