Я устраняю проблему на некоторых локальных сайтах с самозаверяющими сертификатами при использовании компонента http для выполнения HTTP-вызовов в маршрутах (приложение — Springboot 3.2.3, Apache Camel 4.2, Kotlin на Java 17). Я получаю сообщение об ошибке «javax.net.ssl.SSLException: неподдерживаемое или нераспознанное сообщение SSL» независимо от того, что я делаю, пока использую http-компонент, например:
.toD("https://")
Если я использую прокси-сервер для внешнего сайта, он работает нормально, но, похоже, прямые TLS-соединения с сайтами не работают. Я импортировал цепочку сертификатов в оба файла java cacerts, а также попробовал использовать собственный jks или PEM и ссылаться на местоположение в конфигурации приложения (camel.comComponent.http.sslContextParameters.trustManagers.keyStore.resource). Я создал собственный компонент/процессор для прямого вызова с помощью java.net.http.HttpClient, который работал нормально без отключения проверки SSL, чтобы исключить проблему с сертификатом или сайтом. PEM также отлично работает при вызове удаленного сайта в Postman.
Я решил попробовать отключить проверку HTTP-компонента, чтобы исключить проблемы, связанные с сертификатом, и определить, есть ли что-то еще не так, пока создание туннеля TLS в компоненте HTTP, но я не могу найти пример полностью реализованной CamelContextConfiguration. Ниже показано, что я пробовал, но все равно получаю сообщение «javax.net.ssl.SSLException: неподдерживаемое или нераспознанное сообщение SSL», используя .toD("https://")
HttpClientConfigurer
import org.apache.camel.component.http.HttpClientConfigurer
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder
import org.apache.hc.client5.http.impl.io.BasicHttpClientConnectionManager
import org.apache.hc.client5.http.socket.ConnectionSocketFactory
import org.apache.hc.client5.http.socket.PlainConnectionSocketFactory
import org.apache.hc.client5.http.ssl.NoopHostnameVerifier
import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder
import org.apache.hc.client5.http.ssl.TrustSelfSignedStrategy
import org.apache.hc.core5.http.config.RegistryBuilder
import org.apache.hc.core5.ssl.SSLContextBuilder
import javax.net.ssl.HostnameVerifier
import javax.net.ssl.SSLSession
class DisableSSLVerificationConfigurer : HttpClientConfigurer {
override fun configureHttpClient(httpClientBuilder: HttpClientBuilder) {
val sslContext = SSLContextBuilder.create()
.loadTrustMaterial(null, TrustSelfSignedStrategy())
.build()
val sslSocketFactory = SSLConnectionSocketFactoryBuilder.create()
.setSslContext(sslContext)
.setHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.build()
val socketFactoryRegistry = RegistryBuilder.create()
.register("https", sslSocketFactory)
.register("http", PlainConnectionSocketFactory.INSTANCE)
.build()
val connectionManager = BasicHttpClientConnectionManager(socketFactoryRegistry)
httpClientBuilder.setConnectionManager(connectionManager)
}
}
object NoopHostnameVerifier : HostnameVerifier {
override fun verify(hostname: String, session: SSLSession): Boolean {
return true
}
}
CamelContextConfig
import org.apache.camel.CamelContext
import org.apache.camel.spring.boot.CamelContextConfiguration
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.apache.camel.component.http.HttpComponent
@Configuration
class HttpConfig {
@Bean
fun camelContextConfiguration(): CamelContextConfiguration {
return object : CamelContextConfiguration {
override fun beforeApplicationStart(context: CamelContext) {
val httpComponent = context.getComponent("https", HttpComponent::class.java)
httpComponent.setHttpClientConfigurer(DisableSSLVerificationConfigurer())
}
override fun afterApplicationStart(camelContext: CamelContext) {
}
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -component
Отключить проверку SSL в HTTP-компоненте Apache Camel 4.2. ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение