Question

Je construis un petit programme qui agit en tant que client XMPP et je suis en utilisant le Smack bibliothèque . Maintenant, le serveur je me connecte à SSL nécessite (en pidgin je dois vérifier « Force ancienne (port 5223) SSL »). Je vais avoir du mal à obtenir Smack de se connecter à ce serveur. Est-il possible?

Était-ce utile?

La solution

Jetez un oeil à ce fil.

http://www.igniterealtime.org/community/thread/37678

Pour l'essentiel, vous devez ajouter ces deux lignes à votre code:

connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
connConfig.setSocketFactory(new DummySSLSocketFactory());

où connConfig est votre objet ConnectionConfiguration. Obtenez le DummySSLSocketFactory du référentiel de code source Spark. Tout ce qu'il fait est d'accepter pratiquement tout certificat. Cela semblait fonctionner pour moi. Bonne chance!

Autres conseils

Oui, il est assez facile à réaliser. Jetez un oeil à la ConnectionConfiguration classe, et en particulier la méthode de setSecurityMode qui accepte une énumération ConnectionConfiguration.SecurityMode en tant que paramètre. Un réglage à "nécessaires" forces Smack utiliser TLS.

de la Javadoc:

  

Securirty via le cryptage TLS est   nécessaire pour se connecter. Si la   serveur ne propose pas TLS ou si la   TLS negotiaton échoue, la connexion   au serveur échouera.

Vous pouvez y parvenir par ce qui suit:

Stockage du certificat CA dans Keystore

Pour stocker le certificat dans un magasin de clés procédez comme suit.

Étape 1: Télécharger le fichier JAR bouncycastle. Il peut être téléchargé à partir du ici: Bouncy Castle JAVA de presse

Étape 2: Utilisez la commande suivante pour stocker le certificat dans keystore

keytool -importcert -v -trustcacerts -file "<certificate_file_with_path>" -alias "<some_name_for_certificate>" -keystore "<file_name_for_the_output_keystore>" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "<bouncy_castle_jar_file_with_path>" -storetype BKS -storepass "<password_for_the_keystore>"

Étape 3: Vérifiez que le fichier keystore

keytool -importcert -v -list -keystore "<file_name_for_the_keystore_with_path>" -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath "<bouncy_castle_jar_file_with_path>" -storetype BKS -storepass "<password_for_the_keystore>"

Cette liste doit nous le certificat inclus dans le keystore.

Nous avons un keystore que nous pouvons utiliser dans notre code.

Utilisation du keystore

Après avoir généré ce fichier de clés, enregistrez-le dans le dossier brut de votre application. L'utilisation du code ci-dessous pour obtenir la poignée de main de certificat avec le serveur openfire.

Pour créer une connexion avec openfire en utilisant XMPP, vous devrez peut-être obtenir la configuration. Pour la même, utilisez la méthode ci-dessous:

public ConnectionConfiguration getConfigForXMPPCon(Context context) {
        ConnectionConfiguration config = new ConnectionConfiguration(URLConstants.XMPP_HOST, URLConstants.XMPP_PORT);
        config.setSASLAuthenticationEnabled(false);
        config.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
        config.setCompressionEnabled(false);
        SSLContext sslContext = null;
        try {
            sslContext = createSSLContext(context);
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (KeyManagementException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        }

        config.setCustomSSLContext(sslContext);
        config.setSocketFactory(sslContext.getSocketFactory());

        return config;
 }

private SSLContext createSSLContext(Context context) throws KeyStoreException,
            NoSuchAlgorithmException, KeyManagementException, IOException, CertificateException {
        KeyStore trustStore;
        InputStream in = null;
        trustStore = KeyStore.getInstance("BKS");

        if (StringConstants.DEV_SERVER_IP.equals(URLConstants.XMPP_HOST) || StringConstants.TEST_SERVER_IP.equals(URLConstants.XMPP_HOST))
            in = context.getResources().openRawResource(R.raw.ssl_keystore_dev_test);
        else if(StringConstants.STAGE_SERVER_IP.equals(URLConstants.XMPP_HOST) || StringConstants.STAGE2_SERVER_IP.equals(URLConstants.XMPP_HOST))
            in = context.getResources().openRawResource(R.raw.ssl_keystore_stage);
        else if(StringConstants.PROD_SERVER_IP.equals(URLConstants.XMPP_HOST) || StringConstants.PROD1_SERVER_IP.equals(URLConstants.XMPP_HOST))
            in = context.getResources().openRawResource(R.raw.ssl_keystore_prod);

        trustStore.load(in, "<keystore_password>".toCharArray());

        TrustManagerFactory trustManagerFactory = TrustManagerFactory
                .getInstance(KeyManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(trustStore);
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagerFactory.getTrustManagers(),
                new SecureRandom());
        return sslContext;
}

Tout est fait .. !! Il suffit de se connecter .. Maintenant, votre connexion est sécurisée.

Tous suivent la même chose dans mon blog à l'adresse smackssl.blogspot.in

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top