¿Fue útil?

Solución

Tome un vistazo a este hilo.

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

En esencia, 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. Obtener el DummySSLSocketFactory desde el repositorio de código fuente de chispa. Todo lo que hace es aceptar prácticamente cualquier certificado. Esto parecía funcionar para mí. Buena suerte!

Otros consejos

Sí, es muy fácil de lograr. Echar un vistazo a la ConnectionConfiguration clase, y en particular el método setSecurityMode que acepta una enum ConnectionConfiguration.SecurityMode como un parámetro. Al establecer este a fuerzas "necesarios" Smack para usar TLS.

Del Javadoc:

  

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

Puede lograr esto por lo siguiente:

Almacenamiento del certificado de CA en el almacén de claves

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

Paso 1: Descargar el archivo JAR BouncyCastle. 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: Verificar el archivo de almacén de claves

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 enumerará el certificado incluido en el almacén de claves.

Tenemos un almacén de claves que podemos utilizar 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. El uso del código de abajo para conseguir el apretón de manos certificado con el servidor Openfire.

Para crear una conexión con Openfire utilizando XMPP, puede ser necesario para obtener la configuración. Por lo mismo, utilizar 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 .. !! Sólo tiene que conectar .. Ahora su conexión está asegurada.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top