From 73be17af065e804c11b6c495501be47f7bf751de Mon Sep 17 00:00:00 2001 From: Hunter Stern Date: Tue, 12 Jan 2016 16:58:48 -0800 Subject: [PATCH] Disable SNI for a request if that request failed due to an SNI error 'javax.net.ssl.SSLProtocolException: handshake alert: unrecognized_name' --- .../archive/modules/fetcher/FetchHTTP.java | 20 ++++++++++++-- .../modules/fetcher/FetchHTTPRequest.java | 27 ++++++++++++++++++- 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/modules/src/main/java/org/archive/modules/fetcher/FetchHTTP.java b/modules/src/main/java/org/archive/modules/fetcher/FetchHTTP.java index fed4e501..42636120 100644 --- a/modules/src/main/java/org/archive/modules/fetcher/FetchHTTP.java +++ b/modules/src/main/java/org/archive/modules/fetcher/FetchHTTP.java @@ -661,8 +661,24 @@ public class FetchHTTP extends Processor implements Lifecycle { failedExecuteCleanup(curi, e); return; } catch (IOException e) { - failedExecuteCleanup(curi, e); - return; + if ("handshake alert: unrecognized_name".equals(e.getMessage())) { + req.setDisableSNI(true); + + try { + response = req.execute(); + addResponseContent(response, curi); + } catch (ClientProtocolException ee) { + failedExecuteCleanup(curi, e); + return; + } catch (IOException ee) { + failedExecuteCleanup(curi, e); + return; + } + } + else { + failedExecuteCleanup(curi, e); + return; + } } maybeMidfetchAbort(curi, req.request); diff --git a/modules/src/main/java/org/archive/modules/fetcher/FetchHTTPRequest.java b/modules/src/main/java/org/archive/modules/fetcher/FetchHTTPRequest.java index 19a47771..76812ab6 100644 --- a/modules/src/main/java/org/archive/modules/fetcher/FetchHTTPRequest.java +++ b/modules/src/main/java/org/archive/modules/fetcher/FetchHTTPRequest.java @@ -115,6 +115,16 @@ import org.archive.util.Recorder; */ class FetchHTTPRequest { + private boolean disableSNI = false; + + public boolean isDisableSNI() { + return disableSNI; + } + + public void setDisableSNI(boolean disableSNI) { + this.disableSNI = disableSNI; + } + /** * Implementation of {@link DnsResolver} that uses the server cache which is * normally expected to have been populated by FetchDNS. @@ -463,7 +473,22 @@ class FetchHTTPRequest { protected HttpClientConnectionManager buildConnectionManager() { Registry socketFactoryRegistry = RegistryBuilder.create() .register("http", PlainConnectionSocketFactory.INSTANCE) - .register("https", new SSLConnectionSocketFactory(fetcher.sslContext(), new AllowAllHostnameVerifier())) + .register( + "https", + new SSLConnectionSocketFactory(fetcher.sslContext(), + new AllowAllHostnameVerifier()) { + + @Override + public Socket createLayeredSocket( + final Socket socket, final String target, + final int port, final HttpContext context) + throws IOException { + + return super.createLayeredSocket(socket, + isDisableSNI() ? "" : target, port, + context); + } + }) .build(); DnsResolver dnsResolver = new ServerCacheResolver(fetcher.getServerCache());