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

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

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

Вам нужно создать поддельный 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()); 

Рабочий код (в 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()); 

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

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

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

 java -Djavax.net.ssl.trustStore=/path/to/truststore  

В Fedora это может быть системный магазин доверия java в /etc/pki/java/cacerts

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

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

  • Как указать список шифров SSL / TLS, предлагаемый конкретным сайтом?
  • Почему SSL-квитирование дает исключение «Не удалось создать DH keypair»?
  • java.security.cert.CertificateException: сертификаты не соответствуют ограничениям алгоритма
  • Как включить SSL 3 в Java
  • Принудительное HTTPS для определенного URL-адреса
  • Непосредственно считывать / записывать данные подтверждения с помощью памяти BIO
  • Как создать самозаверяющий сертификат с помощью SubjectAltName с помощью OpenSSL?
  • Поддержка Android SSL - SNI
  • Страницы SSL в ASP.NET MVC
  • Android HttpClient и HTTPS
  • Получено фатальное предупреждение: handshake_failure через SSLHandshakeException
  • Давайте будем гением компьютера.