Estoy construyendo un pequeño programa que actúa como un cliente XMPP y estoy usando la biblioteca Smack. Ahora, el servidor al que me estoy conectando requiere SSL (en Pidgin tengo que marcar "Forzar antiguo (puerto 5223) SSL"). Tengo problemas para que Smack se conecte a este servidor. ¿Es posible?Cómo crear una conexión SSL utilizando la biblioteca Smack XMPP?
Respuesta
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!
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á.
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
¿Qué son las clases 'Context' y' R'? –
@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
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. –
- 1. XEP-0080 Ubicación del usuario en la Biblioteca Smack
- 2. Mantenga la conexión XMPP (usando smack) activa en toda la aplicación
- 3. Enviar un mensaje xmpp utilizando una biblioteca de Python
- 4. Cómo recibir mensajes entrantes de XMPP usando Smack?
- 5. cómo depurar una conexión ssl?
- 6. ¿Cómo probarías una conexión SSL?
- 7. ¿Cómo puedo crear una cuenta XMPP?
- 8. Agregar SSL a una conexión
- 9. ¿Cómo enviar un paquete XML personalizado utilizando la API Smack de Java?
- 10. Crear una conexión de cliente TCP con SSL
- 11. ¿La biblioteca mejor conservada de Java XMPP?
- 12. La mejor biblioteca cliente XMPP para Node.js
- 13. Smack Client: el usuario aún está "en línea" aunque se ha cancelado la conexión
- 14. SwipeyTabs: cómo crear Swipey Tabs utilizando la biblioteca ActionBarSherlock?
- 15. XMPP y Android
- 16. Conexión XMPP compartida entre trabajadores de Apio
- 17. ¿Cómo autenticarse en Google Talk con el token de autenticación de AccountManager utilizando Smack API?
- 18. Mantener la conexión XMPP (usando asmack) activa en Android
- 19. iPhone - Conexión SSL
- 20. cómo obtener la misma conexión xmpp de una actividad a otra?
- 21. Biblioteca cliente Python Jabber/XMPP para Twisted
- 22. Biblioteca XMPP para iOS (iPhone/iPad)
- 23. Problema con la conexión SSL de NSStream
- 24. ¿Cómo puedo verificar si una conexión usa ssl?
- 25. Conexión a Google Talk a través de XMPP en Node.js
- 26. diferencia entre nombre de servidor XMPP y nombre de servicio XMPP?
- 27. ¿Existe una biblioteca de código abierto WebSockets (JavaScript) XMPP?
- 28. no se puede conectar al servidor xmpp usando node-xmpp
- 29. Android/Java - ¿Cómo crear una conexión HTTPS?
- 30. cómo detener la apertura de la ventana duplicada utilizando Smack API en swing?
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