14 votes

Android/Java -- Comment créer une connexion HTTPS ?

J'ai ici un code qui me permet de me connecter à des serveurs https et de transférer des données. Cela fonctionne très bien, mais je veux savoir si je le fais de la bonne manière et si j'établis réellement une connexion sécurisée. Veuillez vérifier mon travail. Merci.

public class HTTPSClient extends DefaultHttpClient
{

    public HTTPSClient() 
    {
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager()
    {
        SchemeRegistry registry = new SchemeRegistry();

        HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER;
        final SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
        socketFactory.setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
        //socketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
        registry.register(new Scheme("https", socketFactory, 80));
        registry.register(new Scheme("https", socketFactory, 443));
        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);

        HttpParams params = new BasicHttpParams();
        HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
        HttpProtocolParams.setContentCharset(params, "UTF-8");

        return new SingleClientConnManager(params, registry);
    }
}

J'utilise ce code comme suit :

HttpResponse response = mConnection.httpsClient.execute(new HttpHost("www.somehostname.com", 80), new HttpGet("https://someaddress")));

J'ai ensuite lu la réponse à partir de là. Merci encore.

7voto

saxos Points 1494

Regardez l'officiel Contexte SSL personnalisé du tutoriel Apache HttpClient.

Comme Stephen C l'a mentionné, vous n'avez pas besoin d'enregistrer le port 80 pour le contexte https. Enregistrez-le plutôt pour http (si nécessaire). Cela signifie que, lorsque vous appelez une url https, la socketFactory appropriée, telle que vous l'avez spécifiée, sera utilisée.

REMARQUE : Dans la plupart des cas, vous recevrez un message d'exception "Certificate not trusted" ou similaire lorsque vous vous connecterez, à partir d'appareils Android, à des sites utilisant des certificats personnalisés ou des certificats d'émetteurs peu connus. Si c'est le cas, vous devez créer un magasin de certificats personnalisé pour votre application, afin qu'elle fasse confiance aux certificats de votre serveur. Si vous voulez savoir comment y parvenir, vous pouvez consulter ma page article de blog

Si vous voulez vérifier que votre appareil communique réellement via une connexion sécurisée, vous pouvez appeler le point de terminaison https depuis votre émulateur Android et capturer le trafic à l'aide de la commande suivante Wireshark sur votre machine de développement.

J'espère que cela vous aidera

4voto

Stephen C Points 255558

Je me méfie de ça :

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

En particulier la 2ème ligne. Pourquoi enregistrer le port 80 pour le schéma "https" ?

Soit c'est inoffensif / redondant, soit vous allez envoyer des requêtes "https" au port 80.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X