2009-02-13 5 views

Répondre

7

Jetez un coup d'œil à ce sujet.

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

Essentiellement, 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 à partir du référentiel de code source Spark. Tout ce qu'il fait est d'accepter pratiquement n'importe quel certificat. Cela a semblé fonctionner pour moi. Bonne chance!

+1

Ce DummySSLSocketFactory permet à tout passé du certificat, même si elle est arrivé à expiration ou non roussis par une autorité de certification racine Je suggère donc l'approche d'obtenir le certificat CA et de le stocker dans KeyStore et de l'ajouter dans l'application et d'utiliser la même chose. S'il vous plaît se référer la réponse par moi pour plus de détails. – Iqbal

3

Oui, il est assez facile à réaliser. Jetez un coup d'œil à la classe ConnectionConfiguration, et en particulier à la méthode setSecurityMode qui accepte une énumération ConnectionConfiguration.SecurityMode en tant que paramètre. Régler ceci sur "required" oblige Smack à utiliser TLS.

du Javadoc:

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

3

Vous pouvez y parvenir par ce qui suit:

Stockage du certificat CA dans Keystore

Pour stocker le certificat dans un keystore procédez comme suit.

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

Étape 2: Utilisez la commande suivante pour stocker le certificat 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érifier le keystore fichier

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>" 

Ceci doit nous lister le certificat inclus dans le fichier de clés.

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. Utilisez le code ci-dessous pour obtenir la négociation 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 fait .. !! Connectez-vous simplement. Votre connexion est maintenant sécurisée.

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

+0

Quelles sont les classes 'Context' et' R'? –

+0

@Alastair 'Context' est le contexte de l'application ou de la classe, que vous pouvez passer en utilisant' this'. Et 'R' est une classe à partir de laquelle je reçois les magasins de clés stockés dans mon disque dur dans le répertoire brut, vous pouvez passer directement cette ressource à l'intérieur par tout autre moyen que vous le souhaitez aussi. – Iqbal

+0

On dirait que vous travaillez dans un cadre spécifique. Android? Je ne le suis pas, alors ça m'a un peu dérouté. Mais je l'ai compris. Merci quand même. –

Questions connexes