대규모 Java 응용 프로그램에 추가하는 모듈은 다른 회사의 SSL 보안 웹 사이트와 대화해야합니다. 문제는 사이트가 자체 서명 된 인증서를 사용한다는 것입니다. 중간자 공격이 발생하지 않았 음을 확인하기 위해 인증서 복사본이 있으며 서버에 성공적으로 연결될 수 있도록이 인증서를 코드에 통합해야합니다.
기본 코드는 다음과 같습니다.
void sendRequest(String dataPacket) {
String urlStr = "https://host.example.com/";
URL url = new URL(urlStr);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setMethod("POST");
conn.setRequestProperty("Content-Length", data.length());
conn.setDoOutput(true);
OutputStreamWriter o = new OutputStreamWriter(conn.getOutputStream());
o.write(data);
o.flush();
}
자체 서명 된 인증서에 대한 추가 처리가 없으면 conn.getOutputStream ()에서 다음과 같은 예외가 발생합니다.
Exception in thread "main" javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
....
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
이상적으로, 내 코드는 Java 가이 하나의 자체 서명 된 인증서를 승인하도록 응용 프로그램의 다른 곳에서 사용하도록 Java를 가르쳐야합니다.
인증서를 JRE의 인증 기관 저장소로 가져올 수 있으며 Java가이를 승인 할 수 있음을 알고 있습니다. 그것은 내가 도울 수 있다면 내가 취하고 싶은 접근법이 아닙니다. 사용하지 않을 수있는 하나의 모듈에 대해 모든 고객 컴퓨터에서 수행하는 것은 매우 침습적입니다. 동일한 JRE를 사용하는 다른 모든 Java 응용 프로그램에 영향을 미치며이 사이트에 액세스하는 다른 Java 응용 프로그램의 가능성이 전혀 없어도 마음에 들지 않습니다. 또한 사소한 작업은 아닙니다. UNIX에서는 JRE를 이러한 방식으로 수정하려면 액세스 권한을 얻어야합니다.
또한 일부 사용자 지정 검사를 수행하는 TrustManager 인스턴스를 만들 수 있음을 확인했습니다. 이 인증서를 제외한 모든 인스턴스에서 실제 TrustManager에 위임하는 TrustManager를 작성할 수도있는 것 같습니다. 그러나 TrustManager가 전 세계적으로 설치되는 것처럼 보이며 응용 프로그램의 다른 모든 연결에 영향을 줄 것으로 예상되며 나에게도 좋지 않습니다.
자체 서명 된 인증서를 승인하도록 Java 응용 프로그램을 설정하는 기본, 표준 또는 최상의 방법은 무엇입니까? 위에서 생각한 모든 목표를 달성 할 수 있습니까, 아니면 타협해야합니까? 파일 및 디렉토리, 구성 설정 및 코드가 거의없는 옵션이 있습니까?