Quiero hacer una conexión a un sitio usando una solicitud HTTP normal:

import javax.net.ssl.*;
import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class SSLTest {
public static void main(String [] args) throws Exception {
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
    SSLContext.setDefault(ctx);
    URL url = new URL("https://www.1aauto.com/1961-64-chevy-bel-air-biscayne-impala-fuel-tank-with-strap-set/i/1afrk00087");
    HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
    conn.setHostnameVerifier(new HostnameVerifier() {
        @Override
        public boolean verify(String arg0, SSLSession arg1) {
            return true;
        }
    });
    System.out.println(conn.getResponseCode());
    conn.disconnect();
}
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;
    }
}
}

Ahora, en mi local, está funcionando bien y dando 200 respuestas. Pero en una instancia de AWS EC2, es una excepción

Exception in thread "main" javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:953)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:468)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:338)
at SSLTest.main(SSLTest.java:24)
Caused by: java.io.EOFException: SSL peer shut down incorrectly
at sun.security.ssl.InputRecord.read(InputRecord.java:482)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
... 9 more

Lo que me falta aquí. Por favor ayuda.

0
HackAround 9 dic. 2016 a las 01:31

1 respuesta

La mejor respuesta

¿Son iguales las versiones de Java local y EC2? www.1aauto.com solo es compatible con TLS 1.2, que está habilitado de forma predeterminada en Java 1.8 pero no en versiones anteriores.

Protocols section of SSL Labs report showing only TLS 1.2 enabled Handshake simulation section of SSL Labs report showing errors with older version of Java with default settings

Además, www.1aauto.com presenta un certificado válido en el que confía el almacén de confianza predeterminado de Java. ¿Por qué exactamente está utilizando versiones neutralizadas de TrustManager y HostnameVerifier? No se recomienda el uso de código inseguro como este en un entorno de producción.

0
Anand Bhat 9 dic. 2016 a las 10:26