Java가 "Trust Store"를 무시하고 SSL 인증서를받을 수 있습니까?
-
10-07-2019 - |
문제
Javax.mail API를 사용하여 메일을 보내는 SSL 클라이언트를 작성하려고합니다. 내가 가진 문제는 서버가 SSL을 사용하도록 요청하지만 서버는 비표준 SSL 인증서로 구성되어 있다는 것입니다. 내가 찾은 웹 페이지는 인증서를 Trust Store에 설치해야한다고 말합니다. 나는 그렇게하고 싶지 않습니다 (필요한 권한이 없습니다.)
- Java가 인증서 오류를 무시하고 수락 할 수있는 방법이 있습니까?
- 실패하면 신뢰 상점을 내 프로그램에 현지화하고 전체 JVM에 설치되지 않은 방법이 있습니까?
해결책
모든 인증서를 수락하는 가짜 신탁 관리자를 만들어 관리자로 등록해야합니다. 이 같은:
public class MyManager implements com.sun.net.ssl.X509TrustManager {
public boolean isClientTrusted(X509Certificate[] chain) { return true; }
public boolean isHostTrusted(X509Certificate[] chain) { return true; }
...
}
com.sun.net.ssl.TrustManager[] managers =
new com.sun.net.ssl.TrustManager[] {new MyManager()};
com.sun.net.ssl.SSLContext.getInstance("SSL").
.init(null, managers, new SecureRandom());
다른 팁
#1의 작업 코드 (JDK1.6.0_23).
수입
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
실제 Trust All TrustManager 코드.
TrustManager trm = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(X509Certificate[] certs, String authType) {
}
};
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
이것을 시도하십시오 (질문 2에 대한 답변) :
System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore");
이를 추가 명령 줄 매개 변수로 지정할 수도 있습니다.
java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments>
Fedora에서 이것은 시스템 Wide Java Trust Store 일 수 있습니다. /etc/pki/java/cacerts
그냥 추가하십시오 -Dtrust_all_cert=true
VM 인수에. 이 주장은 Java에게 모든 인증서 검사를 무시하도록 지시합니다.
명령 줄에서는 인수를 추가 할 수 있습니다 -noCertificationCheck
인증서 수표를 무시하기 위해 Java에게.
제휴하지 않습니다 StackOverflow