Comment créer une connexion SSL à l'aide de la bibliothèque Smack XMPP?
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?
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