Можно ли заставить Java игнорировать "хранилище доверия” и просто принимать любой SSL-сертификат, который он получает?
-
10-07-2019 - |
Вопрос
Я пытаюсь написать SSL-клиент, который отправляет почту с помощью javax.mail API.Проблема, с которой я сталкиваюсь, заключается в том, что сервер запрашивает, чтобы я использовал SSL, но сервер также настроен с нестандартным SSL-сертификатом.На веб-страницах, которые я нашел, говорится, что мне нужно установить сертификат в хранилище доверия.Я не хочу этого делать (у меня нет необходимых разрешений).
- Есть ли способ заставить Java просто игнорировать ошибку сертификата и принять ее?
- В противном случае, есть ли способ сделать хранилище доверия локальным для моей программы, а не установленным для всей 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 <remaining arguments>
В Fedora это может быть общесистемное хранилище доверенных сертификатов Java в / etc / pki / java / cacerts
Просто добавьте -Dtrust_all_cert = true
к аргументам виртуальной машины. Этот аргумент говорит java игнорировать все проверки сертификатов.
В командной строке вы можете добавить аргумент -noCertificationCheck
в java, чтобы игнорировать проверки сертификатов.