문제

Javax.mail API를 사용하여 메일을 보내는 SSL 클라이언트를 작성하려고합니다. 내가 가진 문제는 서버가 SSL을 사용하도록 요청하지만 서버는 비표준 SSL 인증서로 구성되어 있다는 것입니다. 내가 찾은 웹 페이지는 인증서를 Trust Store에 설치해야한다고 말합니다. 나는 그렇게하고 싶지 않습니다 (필요한 권한이 없습니다.)

  1. Java가 인증서 오류를 무시하고 수락 할 수있는 방법이 있습니까?
  2. 실패하면 신뢰 상점을 내 프로그램에 현지화하고 전체 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에게.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top