İlkbahar önyükleme dinlenme şablonunda .pfx sertifika ve şifresini kullanarak güvenli dinlenme api'sini nasıl çağırabilirim? [kapalı]

Aug 15 2020

Spring boot uygulamamdan harici bir güvenli dinlenme api'si (ssl etkin) çağırmam gerekiyor. Harici api'ye .pfx sertifikası ve şifresi kullanılarak postacıdan erişilebilir. Şimdi her istekte .pfx dosyası ve parola ekleyerek rest şablonu kullanarak harici api'ye bir çağrı yapmak istiyorum.

Pfx sertifikasını kullanarak ssl üzerinden nasıl rest şablonu çağrısı yapacağımı bilmiyorum. Herhangi bir yardım takdir edilecektir.

Yanıtlar

2 Hakan54 Aug 15 2020 at 19:30

Yapmanız gereken, kalan şablonun temeldeki apache http istemcisini yapılandırmaktır. Aşağıda örnek bir yapılandırma verilmiştir:

SSLContext sslContext = ...;

HttpClient httpClient = HttpClients.custom()
    .setSSLContext(sslContext)
    .build();

HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);

RestTemplate restTemplate = new RestTemplate(requestFactory);

Bir SSLContext oluşturmanıza yardımcı olmak için kullanımı kolay yardımcı program / fabrika / oluşturucu sınıfları sağlayan birkaç kitaplık vardır.

  • Apache SSLContextBuilder
  • Jetty SslContextFactory
  • SSLContext-Kickstart

Benzer işlevsellik sağlayan bir dizi başka kitaplık olabilir, ancak ben sadece bu üçünün farkındayım. Bu arada sslcontext-kickstart benim tarafımdan sağlanan bir kitaplıktır.

Aşağıda, anahtar depolarını yüklemenin ve bir SSLContext oluşturmanın dört yolunun bir özeti verilmiştir. Vanilla Java ve üç kitaplığı kullanarak.

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();
    }

}