2017-11-07 1 views
0

저는 현재 다음 curl 명령을 사용하여 클라이언트 인증서를 필요로하는 웹 서비스에 액세스 할 수 있어요 https://api.com/unit

Java 응용 프로그램에서 어떻게 요청합니까?

curl이 "안전하지 않은"SSL 연결을 만들 수있게하는 -k 플래그가 필요합니다. 이 작업은 Java 응용 프로그램에서도 수행해야합니다.

+0

아래의 답변으로 문제가 해결됩니까? – veebee

+0

@veebe no. 문제에 대한 최종 해결책을 추가하고 있습니다. –

답변

0

이 문제의 최종 해결책은 서버 인증서를 Java 트러스트 스토어에 포함시키는 것이 었습니다.

다운로드 내가 https://github.com/escline/InstallCert

를 사용하는 서버 인증서 키 스토어 및 신뢰가 다음 아래와 같은 시스템 속성에 정의 된을 가져 오려면 :

-Djavax.net.ssl.keyStore =/가정/제이보스/키 .pfx -Djavax.net.ssl.keyStorePassword = xxxx -Djavax.net.ssl ​​= trustStore = $ JAVA_HOME/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword = xxxx -Djavax.net.ssl.keyStoreType = PKCS12 "

0

아래 코드는 클라이언트 SSL 인증과 함께 HTTP GET 요청을 보내는 "sendSSLRequest"메서드를 제공합니다.

import org.apache.http.client.HttpClient; 
import org.apache.http.impl.client.HttpClients; 
import org.apache.http.client.methods.HttpGet; 

public class SSLExample { 

    private final static String ENDPOINT_URL = "https://api.com/unit"; 

    public void sendSSLRequest() { 

     final SSLContext sslContext = SSLContextLoader.initSSLContext(); 

     final HttpClient client = HttpClients.custom() 
            .setSSLContext(sslContext) 
            .build(); 
     final HttpGet request = new HttpGet(ENDPOINT_URL); 

     try { 
     client.execute(request); 
     } catch (final IOException e) { 
     //do some exception handling... 
     } 
    } 
} 

이제 SSLContext : 어딘가에 초기화해야합니다. 아래의 "initSSLContext"메소드는 주어진 키 스토어에서 키 자료를로드하고 주어진 트러스트 스토어에서 트러스티 드 (신뢰할 수있는 인증서)를로드합니다. Trusting all certificates using HttpClient over HTTPS : -k 옵션에 관한

public class SSLContextLoader { 

    private final static String clientKeyStorePath = "/path/to/client/keystore"; 
    private final static String trustStorePath = "/path/to/truststore"; 
    private final static String clientKeyStorePassword = "/password/for/client/keystore"; 
    private final static String trustStorePassword = "/password/for/truststore"; 
    private final static String keyPassword = "/passphrase/for/private/key"; 

    public static SSLContext initSSLContext() { 
     try { 
     final KeyStore clientKeystore = KeyStore.getInstance("JKS"); 
     clientKeystore.load(new FileInputStream(clientKeyStorePath), clientKeyStorePassword.toCharArray()); 
     final KeyStore trustStore = KeyStore.getInstance("JKS"); 
     trustStore.load(new FileInputStream(trustStorePath), trustStorePassword.toCharArray()); 

     final SSLContext sslContext = SSLContexts.custom() 
      .loadTrustMaterial(trustStore, null) 
      .loadKeyMaterial(clientKeystore, keyPassword.toCharArray()) 
      .build(); 

     return sslContext; 
     } catch (KeyStoreException e) { 
     e.printStackTrace(); 
     } catch (CertificateException e) { 
     e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
     } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } catch (UnrecoverableKeyException e) { 
     e.printStackTrace(); 
     } catch (KeyManagementException e) { 
     e.printStackTrace(); 
     } 
    return null; 
    } 
} 

, 나는 다음과 같은 질문/대답 좀보고 당신을 초대합니다.