Jak wywołać Secure Rest API przy użyciu certyfikatu .pfx i hasła w szablonie Spring Boot Rest? [Zamknięte]
Muszę wywołać zewnętrzny zabezpieczony interfejs API REST (włączony protokół SSL) z mojej aplikacji rozruchu wiosennego. Zewnętrzny interfejs API jest dostępny z listonosza przy użyciu certyfikatu i hasła .pfx. Teraz chciałbym nawiązać połączenie z zewnętrznym interfejsem API za pomocą szablonu REST, dołączając plik .pfx i hasło do każdego żądania.
Nie wiem, jak wykonać wywołanie szablonu REST przez SSL przy użyciu certyfikatu PFX. Każda pomoc zostanie doceniona.
Odpowiedzi
To, co musisz zrobić, to skonfigurować podstawowego klienta HTTP Apache dla szablonu Reszta. Poniżej przykładowa konfiguracja:
SSLContext sslContext = ...;
HttpClient httpClient = HttpClients.custom()
.setSSLContext(sslContext)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
RestTemplate restTemplate = new RestTemplate(requestFactory);
Istnieje kilka bibliotek, które zapewniają łatwe w użyciu klasy narzędzi / fabryki / konstruktora, pomagające w tworzeniu SSLContext.
- Apache SSLContextBuilder
- Jetty SslContextFactory
- SSLContext-Kickstart
Może być kilka innych bibliotek, które zapewniają podobną funkcjonalność, ale znam tylko te trzy. Swoją drogą sslcontext-kickstart to biblioteka, którą utrzymuję.
Poniżej znajduje się przegląd czterech sposobów ładowania magazynów kluczy i tworzenia SSLContext. Vanilla Java i przy użyciu trzech bibliotek.
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();
}
}