Conexión Https Android

101

Estoy haciendo una publicación https y obtengo una excepción de la excepción ssl Certificado de servidor no confiable. Si hago http normal, está funcionando perfectamente bien. ¿Tengo que aceptar el certificado del servidor de alguna manera?

Sam97305421562
fuente
¿Puedo obtener una implementación de muestra del mismo
Sam97305421562
Puede que este hilo ayude, pero no puedo decir si funciona con la última API: groups.google.com/group/android-developers/browse_thread/thread/…
RzR

Respuestas:

45

Estoy adivinando, pero si desea que se produzca un apretón de manos real, debe informar a Android de su certificado. Si desea aceptar pase lo que pase, utilice este pseudocódigo para obtener lo que necesita con el cliente HTTP Apache:

SchemeRegistry schemeRegistry = new SchemeRegistry ();

schemeRegistry.register (new Scheme ("http",
    PlainSocketFactory.getSocketFactory (), 80));
schemeRegistry.register (new Scheme ("https",
    new CustomSSLSocketFactory (), 443));

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager (
    params, schemeRegistry);


return new DefaultHttpClient (cm, params);

CustomSSLSocketFactory:

public class CustomSSLSocketFactory extends org.apache.http.conn.ssl.SSLSocketFactory
{
private SSLSocketFactory FACTORY = HttpsURLConnection.getDefaultSSLSocketFactory ();

public CustomSSLSocketFactory ()
    {
    super(null);
    try
        {
        SSLContext context = SSLContext.getInstance ("TLS");
        TrustManager[] tm = new TrustManager[] { new FullX509TrustManager () };
        context.init (null, tm, new SecureRandom ());

        FACTORY = context.getSocketFactory ();
        }
    catch (Exception e)
        {
        e.printStackTrace();
        }
    }

public Socket createSocket() throws IOException
{
    return FACTORY.createSocket();
}

 // TODO: add other methods like createSocket() and getDefaultCipherSuites().
 // Hint: they all just make a call to member FACTORY 
}

FullX509TrustManager es una clase que implementa javax.net.ssl.X509TrustManager, pero ninguno de los métodos realmente realiza ningún trabajo, obtenga una muestra aquí .

¡Buena suerte!

Nate
fuente
¿Por qué existe la variable FACTORY?
Codevalley
1
return FACTORY.createSocket (); está teniendo un problema. El socket creado está dando una excepción de puntero nulo en execute (). Además, noté que hay 2 clases de SocketFactory. 1. org.apache.http.conn.ssl.SSLSocketFactory y 2. javax.net.ssl.SSLSocketFactory
Codevalley
2
Hola Nate, esto parece algo útil para mi situación. Pero tengo algunos problemas para hacer CustomSSLSocketFactory. ¿Qué clase se supone que debe extender? ¿O qué interfaz se supone que debe implementar? He estado experimentando con: javax.net.SocketFactory, javax.net.ssl.SSLSocketFactory, org.apache.http.conn.scheme.SocketFactory, todos los cuales fuerzan la implementación de otros métodos ... Entonces, en general, ¿qué Cuáles son los espacios de nombres de las clases que se utilizan en su código? Gracias. :)
Cephron
2
No funciona para mí, me da el mismo error de certificado de servidor no confiable.
Omar Rehman
1
¿Cómo puedo obtener esta clase?FullX509TrustManager
RajaReddy PolamReddy
89

Esto es lo que estoy haciendo. Simplemente ya no verifica el certificado.

// always verify the host - dont check for certificate
final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
    public boolean verify(String hostname, SSLSession session) {
        return true;
    }
};

/**
 * Trust every server - dont check for any certificate
 */
private static void trustAllHosts() {
    // Create a trust manager that does not validate certificate chains
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return new java.security.cert.X509Certificate[] {};
        }

        public void checkClientTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] chain,
                String authType) throws CertificateException {
        }
    } };

    // Install the all-trusting trust manager
    try {
        SSLContext sc = SSLContext.getInstance("TLS");
        sc.init(null, trustAllCerts, new java.security.SecureRandom());
        HttpsURLConnection
                .setDefaultSSLSocketFactory(sc.getSocketFactory());
    } catch (Exception e) {
        e.printStackTrace();
    }
}

y

    HttpURLConnection http = null;

    if (url.getProtocol().toLowerCase().equals("https")) {
        trustAllHosts();
        HttpsURLConnection https = (HttpsURLConnection) url.openConnection();
        https.setHostnameVerifier(DO_NOT_VERIFY);
        http = https;
    } else {
        http = (HttpURLConnection) url.openConnection();
    }
Ulrich Scheller
fuente
¡Esto luce bien! Sin embargo, estoy usando WebView y solo necesito conectarme a un servidor https para realizar pruebas. (El cliente no puede aprovisionar uno con un FQDN coincidente, ni puede probar en http). ¿Hay alguna forma de abordar esto al usar WebView? ¿Debo simplemente colocar este código en la Actividad donde está WebView y "simplemente funciona"? (¿¿¿No sospechas ... ??)
Joe D'Andrea
Estoy tratando de usar esa solución paso a paso y obtengo tal excepción: 07-25 12: 35: 25.941: WARN / System.err (24383): java.lang.ClassCastException: org.apache.harmony.luni .internal.net.www.protocol.http.HttpURLConnectionImpl en el lugar donde estoy tratando de abrir la conexión ... ¿alguna idea de por qué?
Robert
1
Oye, hice lo que sugieres, pero recibo la excepción como javax.net.ssl.SSLException: Received fatal alert: bad_record_mac. También intenté reemplazar TLScon SSLpero no ayudó. Por favor ayúdame, gracias
devsri
40
Si bien esto es bueno durante la fase de desarrollo, debe tener en cuenta el hecho de que esto le permite a cualquiera MITM su conexión segura falsificando un certificado SSL aleatorio, lo que hace que su conexión ya no sea segura. Eche un vistazo a esta pregunta para ver si se hizo de la manera correcta, aquí para ver cómo recibir un certificado y, finalmente, esto para aprender cómo agregarlo al almacén de claves.
cimnine
2
No debe usar recomendar o publicar este código. Es radicalmente inseguro. Deberías resolver el problema real.
Marqués de Lorne
33

Mientras trataba de responder a esta pregunta, encontré un mejor tutorial. Con él, no tiene que comprometer la verificación del certificado.

http://blog.crazybob.org/2010/02/android-trusting-ssl-certificates.html

* No escribí esto pero gracias a Bob Lee por el trabajo.

bajohn
fuente
4
Esta es la respuesta perfecta. Hice una publicación de actualización que muestra cómo lidiar con las CA que no figuran en la lista, ya que recibía un error de PeerCertificate. Véalo
Donn Felker
4

http://madurangasblogs.blogspot.in/2013/08/avoiding-javaxnetsslsslpeerunverifiedex.html

Cortesía de Maduranga

Al desarrollar una aplicación que usa https, su servidor de prueba no tiene un certificado SSL válido. O a veces, el sitio web utiliza un certificado autofirmado o el sitio web utiliza un certificado SSL gratuito. Entonces, si intenta conectarse al servidor usando ApacheHttpClient , obtendrá una excepción que indica que el "par no autenticado". Aunque no es una buena práctica confiar en todos los certificados de un software de producción, es posible que deba hacerlo de acuerdo con la situación. Esta solución resuelve la excepción causada por "par no autenticado".

Pero antes de ir a la solución, debo advertirle que esta no es una buena idea para una aplicación de producción. Esto violará el propósito de usar un certificado de seguridad. Entonces, a menos que tenga una buena razón o si está seguro de que esto no causará ningún problema, no use esta solución.

Normalmente creas un archivo HttpClientcomo este.

HttpClient httpclient = new DefaultHttpClient();

Pero tienes que cambiar la forma en que creas el HttpClient.

Primero tienes que crear una clase que se extienda org.apache.http.conn.ssl.SSLSocketFactory.

import org.apache.http.conn.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class MySSLSocketFactory extends SSLSocketFactory {
         SSLContext sslContext = SSLContext.getInstance("TLS");

    public MySSLSocketFactory(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
        super(truststore);

        TrustManager tm = 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.init(null, new TrustManager[] { tm }, null);
    }

    @Override
    public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {
        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
    }

    @Override
    public Socket createSocket() throws IOException {
        return sslContext.getSocketFactory().createSocket();
    }
}

Luego crea un método como este.

public HttpClient getNewHttpClient() {
     try {
         KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
         trustStore.load(null, null);

         SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
         sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

         HttpParams params = new BasicHttpParams();
         HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
         HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

         SchemeRegistry registry = new SchemeRegistry();
         registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
         registry.register(new Scheme("https", sf, 443));

         ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

         return new DefaultHttpClient(ccm, params);
     } catch (Exception e) {
         return new DefaultHttpClient();
     }
}

Entonces puede crear el HttpClient.

HttpClient httpclient = getNewHttpClient();

Si está intentando enviar una solicitud de publicación a una página de inicio de sesión, el resto del código sería así.

private URI url = new URI("url of the action of the form");
HttpPost httppost =  new HttpPost(url);
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();  
nameValuePairs.add(new BasicNameValuePair("username", "user"));  
nameValuePairs.add(new BasicNameValuePair("password", "password"));
try {
    httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    InputStream is = entity.getContent();
} catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ClientProtocolException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Obtienes la página html para InputStream. Entonces puede hacer lo que quiera con la página html devuelta.

Pero aquí te enfrentarás a un problema. Si desea gestionar una sesión mediante cookies, no podrá hacerlo con este método. Si desea obtener las cookies, deberá hacerlo a través de un navegador. Entonces solo recibirás cookies.

Rohit Mandiwal
fuente
2

Ninguna de estas respuestas me funcionó, así que aquí hay un código que confía en cualquier certificado.

import java.io.IOException;

    import java.net.Socket;
    import java.security.KeyManagementException;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.UnrecoverableKeyException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;

    import javax.net.ssl.SSLContext;
    import javax.net.ssl.TrustManager;
    import javax.net.ssl.X509TrustManager;

    import org.apache.http.client.ClientProtocolException;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.conn.scheme.PlainSocketFactory;
    import org.apache.http.conn.scheme.Scheme;
    import org.apache.http.conn.scheme.SchemeRegistry;
    import org.apache.http.conn.ssl.SSLSocketFactory;
    import org.apache.http.conn.ssl.X509HostnameVerifier;
    import org.apache.http.impl.client.DefaultHttpClient;
    import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
    import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

    public class HttpsClientBuilder {
        public static DefaultHttpClient getBelieverHttpsClient() {

            DefaultHttpClient client = null;

            SchemeRegistry Current_Scheme = new SchemeRegistry();
            Current_Scheme.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
            try {
                Current_Scheme.register(new Scheme("https", new Naive_SSLSocketFactory(), 8443));
            } catch (KeyManagementException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (UnrecoverableKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (KeyStoreException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            HttpParams Current_Params = new BasicHttpParams();
            int timeoutConnection = 8000;
            HttpConnectionParams.setConnectionTimeout(Current_Params, timeoutConnection);
            int timeoutSocket = 10000;
            HttpConnectionParams.setSoTimeout(Current_Params, timeoutSocket);
            ThreadSafeClientConnManager Current_Manager = new ThreadSafeClientConnManager(Current_Params, Current_Scheme);
            client = new DefaultHttpClient(Current_Manager, Current_Params);
            //HttpPost httpPost = new HttpPost(url);
            //client.execute(httpPost);

         return client;
         }

    public static class Naive_SSLSocketFactory extends SSLSocketFactory
    {
        protected SSLContext Cur_SSL_Context = SSLContext.getInstance("TLS");

        public Naive_SSLSocketFactory ()
                throws NoSuchAlgorithmException, KeyManagementException,
                KeyStoreException, UnrecoverableKeyException
        {
            super(null, null, null, null, null, (X509HostnameVerifier)null);
            Cur_SSL_Context.init(null, new TrustManager[] { new X509_Trust_Manager() }, null);
        }

        @Override
        public Socket createSocket(Socket socket, String host, int port,
                boolean autoClose) throws IOException
        {
            return Cur_SSL_Context.getSocketFactory().createSocket(socket, host, port, autoClose);
        }

        @Override
        public Socket createSocket() throws IOException
        {
            return Cur_SSL_Context.getSocketFactory().createSocket();
        }
    }

    private static class X509_Trust_Manager implements X509TrustManager
    {

        public void checkClientTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            // TODO Auto-generated method stub

        }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            // TODO Auto-generated method stub

        }

        public X509Certificate[] getAcceptedIssuers() {
            // TODO Auto-generated method stub
            return null;
        }

    };
}
Speise
fuente
Este código bien trabaja con patrón de URL - localhost: 8443 / WebProject / YourService
Speise
El constructor SSLSocketFactory (nulo, nulo, nulo, nulo, nulo, X509HostnameVerifier) ​​no está definido
Michal
1

No conozco las especificaciones de Android para los certificados ssl, pero tendría sentido que Android no acepte un certificado ssl autofirmado desde el principio. Encontré esta publicación en foros de Android que parece abordar el mismo problema: http://androidforums.com/android-applications/950-imap-self-signed-ssl-certificates.html

Matti Lyra
fuente
Como dije, no conozco los detalles de Android, pero el día en que tienes que decirle a la plataforma cuál es el certificado ssl del servidor al que te estás conectando. Eso es si está utilizando un certificado autofirmado que no es reconocido por la plataforma. La clase SslCertificate probablemente será útil: developer.android.com/reference/android/net/http/… Profundizaré en esto más tarde hoy, cuando tenga más tiempo.
Matti Lyra
1

Este es un problema conocido con Android 2.x. Estuve luchando con este problema durante una semana hasta que me encontré con la siguiente pregunta, que no solo brinda un buen trasfondo del problema, sino que también brinda una solución funcional y efectiva sin agujeros de seguridad.

Error 'Sin certificado de pares' en Android 2.3 pero NO en 4

alumat
fuente
0

Por alguna razón, la solución mencionada para httpClient anteriormente no funcionó para mí. Al final, pude hacerlo funcionar anulando correctamente el método al implementar la clase SSLSocketFactory personalizada.

@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) 
                              throws IOException, UnknownHostException 
    {
    return sslFactory.createSocket(socket, host, port, autoClose);
}

@Override
public Socket createSocket() throws IOException {
    return sslFactory.createSocket();
}

Así funcionó perfectamente para mí. Puede ver la clase personalizada completa y la implementación en el siguiente hilo: http://blog.syedgakbar.com/2012/07/21/android-https-and-not-trusted-server-certificate-error/

Syed Ghulam Akbar
fuente
0

Hago esta clase y encontré

package com.example.fakessl;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;

import android.util.Log;

public class CertificadoAceptar {
    private static TrustManager[] trustManagers;

    public static class _FakeX509TrustManager implements
            javax.net.ssl.X509TrustManager {
        private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};

        public void checkClientTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public void checkServerTrusted(X509Certificate[] arg0, String arg1)
                throws CertificateException {
        }

        public boolean isClientTrusted(X509Certificate[] chain) {
            return (true);
        }

        public boolean isServerTrusted(X509Certificate[] chain) {
            return (true);
        }

        public X509Certificate[] getAcceptedIssuers() {
            return (_AcceptedIssuers);
        }
    }

    public static void allowAllSSL() {

        javax.net.ssl.HttpsURLConnection
                .setDefaultHostnameVerifier(new HostnameVerifier() {
                    public boolean verify(String hostname, SSLSession session) {
                        return true;
                    }
                });

        javax.net.ssl.SSLContext context = null;

        if (trustManagers == null) {
            trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
        }

        try {
            context = javax.net.ssl.SSLContext.getInstance("TLS");
            context.init(null, trustManagers, new SecureRandom());
        } catch (NoSuchAlgorithmException e) {
            Log.e("allowAllSSL", e.toString());
        } catch (KeyManagementException e) {
            Log.e("allowAllSSL", e.toString());
        }
        javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
                .getSocketFactory());
    }
}

en tu codigo blanco esto

CertificadoAceptar ca = new CertificadoAceptar();
ca.allowAllSSL();
HttpsTransportSE Transport = new HttpsTransportSE("iphost or host name", 8080, "/WS/wsexample.asmx?WSDL", 30000);
Erick Guardado
fuente
0

Fuentes que me ayudaron a trabajar con mi certificado autofirmado en mi servidor Apache de AWS y conectarme con HttpsURLConnection desde un dispositivo Android:

SSL en una instancia de AWS - tutorial de Amazon sobre SSL
Seguridad de Android con HTTPS y SSL - creando su propio administrador de confianza en el cliente para aceptar su certificado
Creación de un certificado autofirmado : secuencia de comandos sencilla para crear sus certificados

Luego hice lo siguiente:

  1. Asegúrese de que el servidor admita https (sudo yum install -y mod24_ssl)
  2. Pon este script en un archivo create_my_certs.sh:
#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p server/ client/ all/

# Create your very own Root Certificate Authority
openssl genrsa \
  -out all/my-private-root-ca.privkey.pem \
  2048

# Self-sign your Root Certificate Authority
# Since this is private, the details can be as bogus as you like
openssl req \
  -x509 \
  -new \
  -nodes \
  -key all/my-private-root-ca.privkey.pem \
  -days 1024 \
  -out all/my-private-root-ca.cert.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"

# Create a Device Certificate for each domain,
# such as example.com, *.example.com, awesome.example.com
# NOTE: You MUST match CN to the domain name or ip address you want to use
openssl genrsa \
  -out all/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key all/privkey.pem \
  -out all/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
openssl x509 \
  -req -in all/csr.pem \
  -CA all/my-private-root-ca.cert.pem \
  -CAkey all/my-private-root-ca.privkey.pem \
  -CAcreateserial \
  -out all/cert.pem \
  -days 500

# Put things in their proper place
rsync -a all/{privkey,cert}.pem server/
cat all/cert.pem > server/fullchain.pem         # we have no intermediates in this case
rsync -a all/my-private-root-ca.cert.pem server/
rsync -a all/my-private-root-ca.cert.pem client/
  1. correr bash create_my_certs.sh yourdomain.com
  2. Coloque los certificados en su lugar apropiado en el servidor (puede encontrar la configuración en /etc/httpd/conf.d/ssl.conf). Todos estos deben establecerse:
    SSLCertificateFile
    SSLCertificateKeyFile
    SSLCertificateChainFile
    SSLCACertificateFile

  3. Reinicie httpd usando sudo service httpd restarty asegúrese de que httpd haya comenzado:
    Deteniendo httpd: [OK]
    Iniciando httpd: [OK]

  4. Copiar my-private-root-ca.certa la carpeta de activos del proyecto de Android

  5. Crea tu administrador de confianza:

    SSLContext SSLContext;

    CertificateFactory cf = CertificateFactory.getInstance ("X.509"); InputStream caInput = context.getAssets (). Open ("mi-raíz-privada-ca.cert.pem"); Certificado ca; intente {ca = cf.generateCertificate (caInput); } finalmente {caInput.close (); }

      // Create a KeyStore containing our trusted CAs
      String keyStoreType = KeyStore.getDefaultType();
      KeyStore keyStore = KeyStore.getInstance(keyStoreType);
      keyStore.load(null, null);
      keyStore.setCertificateEntry("ca", ca);
    
      // Create a TrustManager that trusts the CAs in our KeyStore
      String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
      tmf.init(keyStore);
    
      // Create an SSLContext that uses our TrustManager
      SSLContext = SSLContext.getInstance("TLS");
      SSSLContext.init(null, tmf.getTrustManagers(), null);
  6. Y haz la conexión usando HttpsURLConnection:

    HttpsURLConnection connection = (HttpsURLConnection) url.openConnection (); connection.setSSLSocketFactory (SSLContext.getSocketFactory ());

  7. Eso es todo, prueba tu conexión https.

MikeL
fuente
0

Probablemente puedas probar algo como esto. Esto me ayudó

    SslContextFactory sec = new SslContextFactory();
    sec.setValidateCerts(false);
    sec.setTrustAll(true);

    org.eclipse.jetty.websocket.client.WebSocketClient client = new WebSocketClient(sec);
mzaveruk
fuente
-1

Simplemente use este método como su HTTPClient:

public static  HttpClient getNewHttpClient() {
    try {
        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
        trustStore.load(null, null);

        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);
        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", sf, 443));

        ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

        return new DefaultHttpClient(ccm, params);
    } catch (Exception e) {
        return new DefaultHttpClient();
    }
}
SerCna
fuente