2009-02-13 9 views

Respuesta

7

Eche un vistazo a este hilo.

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

Esencialmente, es necesario agregar estas dos líneas a su código:

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

donde connConfig es su objeto ConnectionConfiguration. Obtenga la DummySSLSocketFactory del repositorio de código fuente de Spark. Todo lo que hace es aceptar virtualmente cualquier certificado. Esto pareció funcionar para mí. ¡Buena suerte!

+1

Esto permite que cualquier DummySSLSocketFactory pasado certificado, incluso si está caducado o que no chamuscado por una autoridad de certificación raíz Así que sugiero el enfoque de obtener el certificado de CA y almacenarlo en KeyStore y agregarlo a la aplicación y usar la misma. Por favor remítame la respuesta para más detalles. – Iqbal

3

Sí, es bastante fácil de lograr. Eche un vistazo a la clase ConnectionConfiguration, y en particular al método setSecurityMode que acepta una configuración ConnectionConfiguration.SecurityMode como parámetro. Ajustándolo a las fuerzas "requeridas", Smack usa TLS.

del Javadoc:

Securirty a través de TLS cifrado se necesaria con el fin de conectar. Si el servidor no ofrece TLS o si la negociación TLS falla, la conexión al servidor fallará.

3

Puede lograr esto por lo siguiente:

Almacenar el certificado de CA en el almacén de claves

Para almacenar el certificado en un almacén de claves siga estos pasos.

Paso 1: Descargue el archivo bouncycastle JAR. Se puede descargar desde el aquí: Castillo hinchable JAVA Lanzamientos

Paso 2: Utilice el siguiente comando para almacenar el certificado en el almacén de claves

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

Paso 3: Compruebe el almacén de claves archivo

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

Esto nos indicará el certificado incluido en el almacén de claves.

Tenemos un almacén de claves que podemos usar en nuestro código.

Uso del almacén de claves

Después de generar este almacén de claves, guardarlo en la carpeta prima de su aplicación. Utilice el siguiente código para obtener el protocolo de enlace con el servidor de OpenFire.

Para crear una conexión con openfire utilizando XMPP, es posible que necesite obtener la configuración. Por la misma, utilice el método siguiente:

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

Todo hecho .. !! Simplemente conecta ... Ahora tu conexión está asegurada.

Todos siguen el mismo en mi blog en smackssl.blogspot.in

+0

¿Qué son las clases 'Context' y' R'? –

+0

@Alastair 'Context' es la aplicación o el contexto de nivel de clase, que puede pasar usando' this'. Y 'R' es una clase de la cual obtengo los almacenes de claves almacenados en mi disco duro en el directorio raw, puede pasar directamente ese recurso a la entrada por cualquier otro medio que desee también. – Iqbal

+0

Parece que está trabajando en un marco específico. ¿Androide? No lo soy, así que esto me confundió un poco. Pero lo descubrí. Gracias de cualquier manera. –

Cuestiones relacionadas