fix: bypass SSL verification for loading.net self-signed cert

RestClient on Railway rejected the untrusted certificate on
prestashop.loading.net, causing SSLHandshakeException on every
HTTP call. Add SslConfig with a trust-all SimpleClientHttpRequestFactory
and inject it into both DolibarrClientConfig and PrestashopClientConfig.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
luklpz 2026-05-14 19:07:47 +02:00
parent 45b805a81a
commit 588c1db5c3
3 changed files with 61 additions and 2 deletions

View File

@ -2,8 +2,10 @@ package com.teterialosjuanjos.tfg.sync_service.config;
import com.teterialosjuanjos.tfg.sync_service.integration.dolibarr.exception.DolibarrApiException; import com.teterialosjuanjos.tfg.sync_service.integration.dolibarr.exception.DolibarrApiException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.StreamUtils; import org.springframework.util.StreamUtils;
import org.springframework.web.client.RestClient; import org.springframework.web.client.RestClient;
@ -18,8 +20,10 @@ import java.nio.charset.StandardCharsets;
public class DolibarrClientConfig { public class DolibarrClientConfig {
@Bean("dolibarrRestClient") @Bean("dolibarrRestClient")
public RestClient dolibarrRestClient(IntegrationProperties props) { public RestClient dolibarrRestClient(IntegrationProperties props,
@Qualifier("lenientRequestFactory") SimpleClientHttpRequestFactory requestFactory) {
return RestClient.builder() return RestClient.builder()
.requestFactory(requestFactory)
.baseUrl(props.dolibarr().baseUrl()) .baseUrl(props.dolibarr().baseUrl())
.defaultHeader("DOLAPIKEY", props.dolibarr().apiKey()) .defaultHeader("DOLAPIKEY", props.dolibarr().apiKey())
.defaultStatusHandler( .defaultStatusHandler(

View File

@ -2,8 +2,10 @@ package com.teterialosjuanjos.tfg.sync_service.config;
import com.teterialosjuanjos.tfg.sync_service.integration.prestashop.exception.PrestashopApiException; import com.teterialosjuanjos.tfg.sync_service.integration.prestashop.exception.PrestashopApiException;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.util.StreamUtils; import org.springframework.util.StreamUtils;
import org.springframework.web.client.RestClient; import org.springframework.web.client.RestClient;
@ -20,8 +22,10 @@ import java.nio.charset.StandardCharsets;
public class PrestashopClientConfig { public class PrestashopClientConfig {
@Bean("prestashopRestClient") @Bean("prestashopRestClient")
public RestClient prestashopRestClient(IntegrationProperties props) { public RestClient prestashopRestClient(IntegrationProperties props,
@Qualifier("lenientRequestFactory") SimpleClientHttpRequestFactory requestFactory) {
return RestClient.builder() return RestClient.builder()
.requestFactory(requestFactory)
.baseUrl(props.prestashop().baseUrl()) .baseUrl(props.prestashop().baseUrl())
.defaultStatusHandler( .defaultStatusHandler(
status -> status.isError(), status -> status.isError(),

View File

@ -0,0 +1,51 @@
package com.teterialosjuanjos.tfg.sync_service.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import javax.net.ssl.*;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
/**
* Provides an HTTP factory that skips SSL verification.
*
* <p>Needed because {@code prestashop.loading.net} uses a certificate not trusted by
* the JVM default truststore on Railway. The server is a known internal host, so
* bypassing certificate validation is acceptable in this context.</p>
*/
@Configuration
public class SslConfig {
@Bean("lenientRequestFactory")
public SimpleClientHttpRequestFactory lenientRequestFactory()
throws NoSuchAlgorithmException, KeyManagementException {
TrustManager[] trustAll = {new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
public void checkClientTrusted(X509Certificate[] c, String a) {}
public void checkServerTrusted(X509Certificate[] c, String a) {}
}};
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAll, new SecureRandom());
SSLSocketFactory socketFactory = sslContext.getSocketFactory();
return new SimpleClientHttpRequestFactory() {
@Override
protected void prepareConnection(HttpURLConnection connection, String httpMethod)
throws IOException {
if (connection instanceof HttpsURLConnection https) {
https.setSSLSocketFactory(socketFactory);
https.setHostnameVerifier((host, session) -> true);
}
super.prepareConnection(connection, httpMethod);
}
};
}
}