Chvalov
@Chvalov

OkHTTP как игнорировать SSL сертификат?

Ищу универсальное решение обхода SSL сертификата с помощью OkHTTP 3
Мой код:
private static final long CONNECT_TIMEOUT = 20000;   // 2 seconds
    private static final long READ_TIMEOUT = 20000;      // 2 seconds

    public static void GetHeader(){
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
                .readTimeout(READ_TIMEOUT, TimeUnit.MILLISECONDS)
                .followSslRedirects(false)
                .followRedirects(false)
                .build();

        Request request = new Request.Builder()
                .header("key", "test:test")
                .url("https://test-local.local")
                .build();
        try {
            Response response = client.newCall(request).execute();
            System.out.println("Редирект: " + response.isRedirect());
            System.out.println("Code: " + response.code());
            System.out.println("\nHeaders:\n" + response.headers());
            //System.out.println("\n\nBody:\n" + response.body().string());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


Если сайт имеет SSL получаю ошибку javax.net.ssl.SSLPeerUnverifiedException
Это исправил таким способом:
.followRedirects(false)
                .hostnameVerifier(new HostnameVerifier() {
                    @Override
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                })
                .build();


Если SSL сертификат истек/не действительный или еще какие-то проблемы то получаю еще ряд новых ошибок:
Errors (Spoiler)
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
...
Caused by: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
...
Caused by: java.security.cert.CertPathValidatorException: timestamp check failed
...
Caused by: java.security.cert.CertificateExpiredException: NotAfter: Thu Jan 12 18:13:11 EET 2017


Как заставить OkHTTP игнорировать SSL сертификаты полностью чтобы не возникало таких ошибок ?
И возможно ли подскавить свой корневой сертификат (Certificate Authority) ?
  • Вопрос задан
  • 3300 просмотров
Пригласить эксперта
Ответы на вопрос 1
mitaichik
@mitaichik
Хз поможет ли, делал временное решения для работы с самоподписанными сертификатами, все ненужное вырезал оставил только суть:
@Component
public class ClientFactory
{
	@Value("${api.certificate.path}")
	private String certificatePath;

	@Value("${api.certificate.password}")
	private String certificatePassword;

	@Value("${api.params.site}")
	private String paramSite;

	/**
	 *
	 * @return
	 * @throws Throwable
	 */
	public OkHttpClient createClient() throws Throwable
	{
		return new OkHttpClient.Builder()
			.socketFactory(createSslContext().getSocketFactory())
			.build();
	}

	/**
	 *
	 * @return
	 * @throws Throwable
	 */
	private SSLContext createSslContext() throws Throwable
	{
		KeyStore ks = getCertificateKeyStore();

		KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
		kmf.init(ks, certificatePassword.toCharArray());

		SSLContext sslContext = SSLContext.getInstance("SSL");
		sslContext.init(kmf.getKeyManagers(), trustAll509(), new java.security.SecureRandom());

		return sslContext;

	}

	/**
	 * @return
	 */
	private TrustManager[] trustAll509()
	{
		return new TrustManager[] {
			new X509TrustManager() {
				public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
				public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}
				public X509Certificate[] getAcceptedIssuers() {return null;}
			}
		};
	}
}


Самое главное здесь - подставить в SSLContext свой X509TrustManager, который тупо будет всех пропускать и ничего не проверять.

Но!!! Это должно быть временным решением для разработки/отладки/тестов. Если вы юзаете невалидные сертификаты - что то вы делаете не так.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы