¿Cómo llamar a la API de descanso seguro usando el certificado y la contraseña .pfx en la plantilla de descanso de arranque de primavera? [cerrado]
Necesito invocar una api de descanso segura externa (SSL habilitado) desde mi aplicación de arranque de primavera. El cartero puede acceder a la api externa mediante el certificado y la contraseña .pfx. Ahora me gustaría hacer una llamada a la API externa usando la plantilla de descanso adjuntando el archivo .pfx y la contraseña en cada solicitud.
No sé cómo hacer una llamada de plantilla de descanso sobre ssl usando el certificado pfx. Se agradecerá cualquier ayuda.
Respuestas
Lo que debe hacer es configurar el cliente http de Apache subyacente de la plantilla de descanso. A continuación se muestra una configuración de ejemplo:
SSLContext sslContext = ...;
HttpClient httpClient = HttpClients.custom()
.setSSLContext(sslContext)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
Hay un par de bibliotecas que proporcionan clases de utilidad / fábrica / constructor fáciles de usar para ayudarlo a crear un SSLContext.
- Apache SSLContextBuilder
- Jetty SslContextFactory
- SSLContext-Kickstart
Podría haber muchas otras bibliotecas que brinden una funcionalidad similar, pero solo conozco estas tres. Por cierto, sslcontext-kickstart es una biblioteca mantenida por mí.
A continuación se muestra una descripción general de cuatro formas de cargar los almacenes de claves y crear un SSLContext. Vanilla Java y utilizando las tres bibliotecas.
import io.netty.handler.ssl.SslContextBuilder;
import nl.altindag.ssl.SSLFactory;
import org.apache.http.ssl.SSLContextBuilder;
import org.eclipse.jetty.util.ssl.SslContextFactory;
import javax.net.ssl.*;
import java.io.File;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.Objects;
class SslExample {
public static void main(String[] args) throws Exception {
//creating sslContext with sslcontext-kickstart
SSLFactory sslFactory = SSLFactory.builder()
.withIdentityMaterial("keystore.pfx", "secret".toCharArray())
.withTrustMaterial("truststore.pfx", "secret".toCharArray())
.build();
SSLContext sslContext = sslFactory.getSslContext();
//Traditional flow of creating sslContext
String keyStorePath = "keystore.pfx";
String trustStorePath = "truststore.pfx";
char[] keyStorePassword = "secret".toCharArray();
char[] trustStorePassword = "secret".toCharArray();
KeyStore keyStore = KeyStore.getInstance("PKCS12");
KeyStore trustStore = KeyStore.getInstance("PKCS12");
try(InputStream keyStoreInputStream = SslExample.class.getClassLoader().getResourceAsStream(keyStorePath);
InputStream trustStoreInputStream = SslExample.class.getClassLoader().getResourceAsStream(trustStorePath)) {
Objects.requireNonNull(keyStoreInputStream);
Objects.requireNonNull(trustStoreInputStream);
keyStore.load(keyStoreInputStream, keyStorePassword);
trustStore.load(trustStoreInputStream, trustStorePassword);
}
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(keyStore, keyStorePassword);
KeyManager[] keyManagers = keyManagerFactory.getKeyManagers();
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(trustStore);
TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
SSLContext sslContext1 = SSLContext.getInstance("TLSv1.2");
sslContext.init(keyManagers, trustManagers, new SecureRandom());
//creating sslContext with Apache SSLContextBuilder
SSLContext sslContext2 = SSLContextBuilder.create()
.loadKeyMaterial(new File("keystore.pfx"), "secret".toCharArray(), "secret".toCharArray())
.loadTrustMaterial(new File("truststore.pfx"), "secret".toCharArray())
.build();
//creating sslContext with Jetty SslContextFactory
SslContextFactory.Client sslContextFactory = new SslContextFactory.Client();
sslContextFactory.setKeyStorePath("keystore.pfx");
sslContextFactory.setKeyStorePassword("secret");
sslContextFactory.setTrustStorePath("truststore.pfx");
sslContextFactory.setTrustStorePassword("secret");
sslContextFactory.start();
SSLContext sslContext3 = sslContextFactory.getSslContext();
}
}