Connexion Https Android

101

Je fais un message https et je reçois une exception de certificat de serveur non approuvé d'exception SSL. Si je fais du http normal, cela fonctionne parfaitement. Dois-je accepter le certificat du serveur d'une manière ou d'une autre?

Sam97305421562
la source
Puis-je obtenir un exemple d'implémentation de la même chose
Sam97305421562
peut ce fil aider, mais je ne peux pas dire si cela fonctionne la dernière API: groups.google.com/group/android-developers/browse_thread/thread/…
RzR

Réponses:

45

Je fais une supposition, mais si vous voulez qu'une véritable poignée de main se produise, vous devez informer Android de votre certificat. Si vous voulez simplement accepter quoi qu'il arrive, utilisez ce pseudo-code pour obtenir ce dont vous avez besoin avec le client 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 est une classe qui implémente javax.net.ssl.X509TrustManager, mais aucune des méthodes n'effectue réellement de travail, obtenez un exemple ici .

Bonne chance!

Nate
la source
Pourquoi existe-t-il la variable FACTORY ??
Codevalley
1
return FACTORY.createSocket (); a un problème. La socket créée donne une exception Pointer null sur execute (). De plus, j'ai remarqué qu'il existe 2 classes SocketFactory. 1. org.apache.http.conn.ssl.SSLSocketFactory et 2. javax.net.ssl.SSLSocketFactory
Codevalley
2
Salut Nate, cela semble être quelque chose d'utile dans ma situation. Mais, j'ai quelques problèmes avec la création de CustomSSLSocketFactory. Quelle classe est-elle censée étendre? Ou quelle interface est-il censé implémenter? J'ai expérimenté avec: javax.net.SocketFactory, javax.net.ssl.SSLSocketFactory, org.apache.http.conn.scheme.SocketFactory, qui forcent tous l'implémentation d'autres méthodes ... Donc, en général, quoi sont les espaces de noms des classes utilisés dans votre code? Je vous remercie. :)
Cephron
2
Ne fonctionne pas pour moi, me donne la même erreur de certificat de serveur non approuvé.
Omar Rehman
1
comment puis-je obtenir ce coursFullX509TrustManager
RajaReddy PolamReddy
89

C'est ce que je fais. Il ne vérifie tout simplement plus le certificat.

// 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();
    }
}

et

    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
la source
Cela semble bon! J'utilise WebView, cependant, et je n'ai besoin que de me connecter à un serveur https à des fins de test. (Le client ne peut pas en fournir un avec un FQDN correspondant, ni tester sur http.) Existe-t-il un moyen de résoudre ce problème lors de l'utilisation de WebView? Dois-je simplement déposer ce code dans l'activité où se trouve WebView et "ça marche juste?" (Suspecting not… ??)
Joe D'Andrea
J'essaie d'utiliser cette solution étape par étape et j'obtiens une telle exception: 07-25 12: 35: 25.941: WARN / System.err (24383): java.lang.ClassCastException: org.apache.harmony.luni .internal.net.www.protocol.http.HttpURLConnectionImpl en place où j'essaie d'ouvrir la connexion ... une idée pourquoi ??
Robert
1
Hey j'ai fait comme suggéré par vous mais je reçois l'exception comme javax.net.ssl.SSLException: Received fatal alert: bad_record_mac. J'ai également essayé de remplacer TLSpar SSLmais cela n'a pas aidé. S'il vous plaît, aidez-moi, merci
devsri
40
Bien que cela soit bon pendant la phase de développement, vous devez être conscient du fait que cela permet à quiconque de MITM votre connexion sécurisée en simulant un certificat SSL aléatoire, ce qui rend votre connexion plus sécurisée. Jetez un œil à cette question pour voir qu'elle est faite dans le bon sens, ici pour voir comment recevoir un certificat, et enfin ceci pour apprendre comment l'ajouter au keystore.
cimnine
2
Vous ne devez pas utiliser recommander ou publier ce code. Il est radicalement peu sûr. Vous devez résoudre le problème réel.
Marquis of Lorne
33

En essayant de répondre à cette question, j'ai trouvé un meilleur tutoriel. Avec lui, vous n'avez pas à compromettre la vérification du certificat.

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

* Je n'ai pas écrit ceci mais merci à Bob Lee pour le travail

bajohns
la source
4
C'est la réponse parfaite. J'ai publié un article de mise à jour qui montre comment gérer les autorités de certification non répertoriées car j'obtenais une erreur PeerCertificate. Voir ici: blog.donnfelker.com/2011/06/13/…
Donn Felker
4

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

Gracieuseté de Maduranga

Lors du développement d'une application utilisant https, votre serveur de test ne dispose pas d'un certificat SSL valide. Parfois, le site Web utilise un certificat auto-signé ou le site Web utilise un certificat SSL gratuit. Donc, si vous essayez de vous connecter au serveur en utilisant ApacheHttpClient , vous obtiendrez une exception indiquant que le "pair non authentifié". Bien que faire confiance à tous les certificats d'un logiciel de production ne soit pas une bonne pratique, vous devrez peut-être le faire en fonction de la situation. Cette solution résout l'exception provoquée par «pair non authentifié».

Mais avant de passer à la solution, je dois vous avertir que ce n'est pas une bonne idée pour une application de production. Cela enfreindra l'objectif de l'utilisation d'un certificat de sécurité. Donc, sauf si vous avez une bonne raison ou si vous êtes sûr que cela ne posera aucun problème, n'utilisez pas cette solution.

Normalement, vous créez un HttpClientcomme celui-ci.

HttpClient httpclient = new DefaultHttpClient();

Mais vous devez changer la façon dont vous créez le HttpClient.

Vous devez d'abord créer une extension de classe 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();
    }
}

Ensuite, créez une méthode comme celle-ci.

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();
     }
}

Ensuite, vous pouvez créer le fichier HttpClient.

HttpClient httpclient = getNewHttpClient();

Si vous essayez d'envoyer une demande de publication sur une page de connexion, le reste du code ressemblerait à ceci.

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();
}

Vous obtenez la page html dans InputStream. Ensuite, vous pouvez faire ce que vous voulez avec la page html renvoyée.

Mais ici, vous serez confronté à un problème. Si vous souhaitez gérer une session à l'aide de cookies, vous ne pourrez pas le faire avec cette méthode. Si vous souhaitez obtenir les cookies, vous devrez le faire via un navigateur. Alors seulement vous recevrez des cookies.

Rohit Mandiwal
la source
3

Si vous utilisez un certificat StartSSL ou Thawte, il échouera pour Froyo et les versions antérieures. Vous pouvez utiliser le référentiel CAcert d' une version plus récente au lieu d'approuver chaque certificat.

Juan Sánchez
la source
2

Aucune de ces réponses n'a fonctionné pour moi, voici donc un code qui fait confiance à tous les certificats.

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
la source
Ce code fonctionne très bien avec le modèle d'URL - localhost: 8443 / webProject / YourService
Speise
Le constructeur SSLSocketFactory (null, null, null, null, null, X509HostnameVerifier) ​​est indéfini
Michal
1

Je ne connais pas les spécificités d'Android pour les certificats SSL, mais il serait logique qu'Android n'accepte pas un certificat SSL auto-signé dès le départ. J'ai trouvé ce post sur les forums Android qui semble résoudre le même problème: http://androidforums.com/android-applications/950-imap-self-signed-ssl-certificates.html

Matti Lyra
la source
Comme je l'ai dit, je ne connais pas les spécificités d'Android, mais je suis le jour où vous devez dire à la plate-forme quel est le certificat SSL du serveur auquel vous vous connectez. C'est si vous utilisez un certificat auto-signé qui n'est pas reconnu par la plate-forme. La classe SslCertificate sera probablement utile: developer.android.com/reference/android/net/http/ ... Je vais creuser cela plus tard dans la journée quand j'aurai plus de temps.
Matti Lyra
1

Il s'agit d'un problème connu avec Android 2.x. Je luttais avec ce problème pendant une semaine jusqu'à ce que je tombe sur la question suivante, qui non seulement donne un bon aperçu du problème, mais fournit également une solution fonctionnelle et efficace dépourvue de toute faille de sécurité.

Erreur `` Pas de certificat de pair '' dans Android 2.3 mais PAS dans 4

alumat
la source
0

Pour une raison quelconque, la solution mentionnée pour httpClient ci-dessus n'a pas fonctionné pour moi. À la fin, j'ai pu le faire fonctionner en remplaçant correctement la méthode lors de l'implémentation de la classe SSLSocketFactory personnalisée.

@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();
}

C'est ainsi que cela a parfaitement fonctionné pour moi. Vous pouvez voir la classe personnalisée complète et l'implémentation sur le fil suivant: http://blog.syedgakbar.com/2012/07/21/android-https-and-not-trusted-server-certificate-error/

Syed Ghulam Akbar
la source
0

Je fais ce cours et j'ai trouvé

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());
    }
}

dans ton code blanc

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

Sources qui m'ont aidé à travailler avec mon certificat auto-signé sur mon serveur AWS Apache et à me connecter avec HttpsURLConnection à partir d'un appareil Android:

SSL sur l'instance aws - tutoriel amazon sur ssl
Android Security avec HTTPS et SSL - création de votre propre gestionnaire de confiance sur le client pour l'acceptation votre certificat Création d' un certificat
auto-signé - script facile pour créer vos certificats

Ensuite, j'ai fait ce qui suit:

  1. Assurez-vous que le serveur prend en charge https (sudo yum install -y mod24_ssl)
  2. Mettez ce script dans un fichier 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. Courir bash create_my_certs.sh yourdomain.com
  2. Placez les certificats à leur place sur le serveur (vous pouvez trouver la configuration dans /etc/httpd/conf.d/ssl.conf). Tous ceux-ci doivent être définis:
    SSLCertificateFile
    SSLCertificateKeyFile
    SSLCertificateChainFile
    SSLCACertificateFile

  3. Redémarrez httpd en utilisant sudo service httpd restartet assurez-vous que httpd a démarré:
    Arrêt de httpd: [OK]
    Démarrage de httpd: [OK]

  4. Copier my-private-root-ca.certdans le dossier des actifs de votre projet Android

  5. Créez votre gestionnaire de confiance:

    SSLContext SSLContext;

    CertificateFactory cf = CertificateFactory.getInstance ("X.509"); InputStream caInput = context.getAssets (). Open ("ma-racine-privée-ca.cert.pem"); Certificat ca; essayez {ca = cf.generateCertificate (caInput); } enfin {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. Et établissez la connexion en utilisant HttpsURLConnection:

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

  7. Thats it, essayez votre connexion https.

MikeL
la source
0

Vous pouvez probablement essayer quelque chose comme ça. Cela m'a aidé

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

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

Utilisez simplement cette méthode comme 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
la source