저는 현재 다음 curl 명령을 사용하여 클라이언트 인증서를 필요로하는 웹 서비스에 액세스 할 수 있어요 https://api.com/unit는
Java 응용 프로그램에서 어떻게 요청합니까?
curl이 "안전하지 않은"SSL 연결을 만들 수있게하는 -k 플래그가 필요합니다. 이 작업은 Java 응용 프로그램에서도 수행해야합니다.
저는 현재 다음 curl 명령을 사용하여 클라이언트 인증서를 필요로하는 웹 서비스에 액세스 할 수 있어요 https://api.com/unit는
Java 응용 프로그램에서 어떻게 요청합니까?
curl이 "안전하지 않은"SSL 연결을 만들 수있게하는 -k 플래그가 필요합니다. 이 작업은 Java 응용 프로그램에서도 수행해야합니다.
이 문제의 최종 해결책은 서버 인증서를 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 "
아래 코드는 클라이언트 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;
}
}
, 나는 다음과 같은 질문/대답 좀보고 당신을 초대합니다.
아래의 답변으로 문제가 해결됩니까? – veebee
@veebe no. 문제에 대한 최종 해결책을 추가하고 있습니다. –