Можно ли заставить Java игнорировать «хранилище доверия» и просто принимать любой полученный SSL-сертификат? - PullRequest
21 голосов
/ 02 августа 2009

Я пытаюсь написать клиент SSL, который отправляет почту с использованием API javax.mail. Проблема, с которой я сталкиваюсь, заключается в том, что сервер запрашивает использование SSL, но на сервере также настроен нестандартный сертификат SSL. Веб-страницы, которые я нашел, говорят, что мне нужно установить сертификат в хранилище доверенных сертификатов. Я не хочу этого делать (у меня нет необходимых разрешений.)

  1. Есть ли способ заставить Java просто проигнорировать ошибку сертификата и принять ее?
  2. В противном случае, существует ли способ, чтобы хранилище доверенных сертификатов было локальным для моей программы и не устанавливалось для всей JVM?

Ответы [ 5 ]

29 голосов
/ 15 апреля 2011

Рабочий код (в jdk1.6.0_23) для # 1.

Импорт

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;

Фактическое доверие всему коду 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());
19 голосов
/ 02 августа 2009

Вам необходимо создать поддельный TrustManager, который принимает все сертификаты, и зарегистрировать его в качестве менеджера. Примерно так:

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());
7 голосов
/ 02 августа 2009

Попробуйте (ответ на вопрос 2):

System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore");

Вы также можете указать это как дополнительный параметр командной строки:

java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments>

В Fedora это может быть общесистемное хранилище доверенных сертификатов Java в /etc/pki/java/cacerts

0 голосов
/ 31 июля 2017

В командной строке вы можете добавить аргумент -noCertificationCheck в java, чтобы игнорировать проверки сертификатов.

0 голосов
/ 21 ноября 2016

Просто добавьте -Dtrust_all_cert=true к аргументам виртуальной машины. Этот аргумент говорит java игнорировать все проверки сертификатов.

...