diff --git a/pom.xml b/pom.xml index 542b1b28..8ccf0eca 100644 --- a/pom.xml +++ b/pom.xml @@ -538,6 +538,11 @@ gwt-servlet 2.9.0 + + io.github.hakky54 + sslcontext-kickstart + 7.2.0 + com.google.apis diff --git a/src/main/java/com/commafeed/backend/HttpGetter.java b/src/main/java/com/commafeed/backend/HttpGetter.java index 03f4502a..f650f93a 100644 --- a/src/main/java/com/commafeed/backend/HttpGetter.java +++ b/src/main/java/com/commafeed/backend/HttpGetter.java @@ -1,20 +1,9 @@ package com.commafeed.backend; import java.io.IOException; -import java.security.SecureRandom; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; import javax.inject.Inject; import javax.inject.Singleton; -import javax.net.ssl.KeyManager; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -34,7 +23,6 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.config.ConnectionConfig; -import org.apache.http.conn.ssl.NoopHostnameVerifier; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; @@ -42,11 +30,14 @@ import org.apache.http.util.EntityUtils; import com.commafeed.CommaFeedConfiguration; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import nl.altindag.ssl.SSLFactory; + /** * Smart HTTP getter: handles gzip, ssl, last modified and etag headers - * + * */ -@Slf4j @Singleton public class HttpGetter { @@ -56,15 +47,7 @@ public class HttpGetter { private static final HttpResponseInterceptor REMOVE_INCORRECT_CONTENT_ENCODING = new ContentEncodingInterceptor(); - private static SSLContext SSL_CONTEXT = null; - static { - try { - SSL_CONTEXT = SSLContext.getInstance("TLS"); - SSL_CONTEXT.init(new KeyManager[0], new TrustManager[] { new DefaultTrustManager() }, new SecureRandom()); - } catch (Exception e) { - log.error("Could not configure ssl context"); - } - } + private static final SSLFactory SSL_FACTORY = SSLFactory.builder().withUnsafeTrustMaterial().withUnsafeHostnameVerifier().build(); private String userAgent; @@ -81,7 +64,7 @@ public class HttpGetter { } /** - * + * * @param url * the url to retrive * @param lastModified @@ -94,8 +77,8 @@ public class HttpGetter { * @throws NotModifiedException * if the url hasn't changed since we asked for it last time */ - public HttpResult getBinary(String url, String lastModified, String eTag, int timeout) throws ClientProtocolException, IOException, - NotModifiedException { + public HttpResult getBinary(String url, String lastModified, String eTag, int timeout) + throws ClientProtocolException, IOException, NotModifiedException { HttpResult result = null; long start = System.currentTimeMillis(); @@ -171,25 +154,14 @@ public class HttpGetter { return result; } - @Getter - @RequiredArgsConstructor - public static class HttpResult { - private final byte[] content; - private final String contentType; - private final String lastModifiedSince; - private final String eTag; - private final long duration; - private final String urlAfterRedirect; - } - public static CloseableHttpClient newClient(int timeout) { HttpClientBuilder builder = HttpClients.custom(); builder.useSystemProperties(); builder.addInterceptorFirst(REMOVE_INCORRECT_CONTENT_ENCODING); builder.disableAutomaticRetries(); - builder.setSSLContext(SSL_CONTEXT); - builder.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE); + builder.setSSLContext(SSL_FACTORY.getSslContext()); + builder.setSSLHostnameVerifier(SSL_FACTORY.getHostnameVerifier()); RequestConfig.Builder configBuilder = RequestConfig.custom(); configBuilder.setCookieSpec(CookieSpecs.IGNORE_COOKIES); @@ -203,6 +175,13 @@ public class HttpGetter { return builder.build(); } + public static void main(String[] args) throws Exception { + CommaFeedConfiguration config = new CommaFeedConfiguration(); + HttpGetter getter = new HttpGetter(config); + HttpResult result = getter.getBinary("https://sourceforge.net/projects/mpv-player-windows/rss", 30000); + System.out.println(new String(result.content)); + } + public static class NotModifiedException extends Exception { private static final long serialVersionUID = 1L; @@ -212,25 +191,15 @@ public class HttpGetter { } - private static class DefaultTrustManager implements X509TrustManager { - @Override - public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { - } - - @Override - public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - return null; - } + @Getter + @RequiredArgsConstructor + public static class HttpResult { + private final byte[] content; + private final String contentType; + private final String lastModifiedSince; + private final String eTag; + private final long duration; + private final String urlAfterRedirect; } - public static void main(String[] args) throws Exception { - CommaFeedConfiguration config = new CommaFeedConfiguration(); - HttpGetter getter = new HttpGetter(config); - HttpResult result = getter.getBinary("https://sourceforge.net/projects/mpv-player-windows/rss", 30000); - System.out.println(new String(result.content)); - } }