Я получаю исключение ниже, в ответ на вызов службы 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.
Дайте мне знать, если потребуется какая-либо другая информация.
Вы случайно передаете 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
}
Я также добавил NoopHostNameVerifier, но все равно не повезло. return new OkHttpClient().newBuilder().sslSocketFactory(sslSocketFactory).hostnameVerifier(NoopHostnameVerifier.INSTANCE).build();
Спасибо Юрий. использование метода sslSocketFactory вместо метода socketFactory решило мою проблему, как показано ниже.
Этот метод устарел, поэтому странно, что вы выбрали его, он буквально не работает на некоторых платформах. Так что ваш код не будет переносимым.
В более высокой среде я получаю ниже исключение java.net.UnknownHostException: <servicename>: временный сбой в разрешении имени