Come creare una connessione SSL utilizzando la libreria Smack XMPP?
Domanda
Sto costruendo un piccolo programma che agisce come un client XMPP e sto utilizzando il rel="noreferrer"> . Ora, il server mi connette richiede SSL (in Pidgin devo controllare "Forza vecchio 5223) SSL porta ("). Sto avendo difficoltà a raggiungere Smack per connettersi a questo server. E 'possibile?
Soluzione
Date un'occhiata a questo thread.
http://www.igniterealtime.org/community/thread/37678
In sostanza, è necessario aggiungere queste due righe al codice:
connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
connConfig.setSocketFactory(new DummySSLSocketFactory());
dove connConfig è l'oggetto ConnectionConfiguration. Prendi il DummySSLSocketFactory dal codice repository dei sorgenti Spark. Tutto ciò che fa è accettare praticamente qualsiasi certificato. Questo sembrava funzionare per me. Buona fortuna!
Altri suggerimenti
Sì, è abbastanza facile da raggiungere. Date un'occhiata alla ConnectionConfiguration classe, e in particolare il metodo setSecurityMode che accetta un'enumerazione ConnectionConfiguration.SecurityMode come parametro. L'impostazione di questa alle forze "necessaria" Smack utilizzare TLS.
dal Javadoc:
Securirty tramite crittografia TLS è richiesto per collegare. Se la Server non offre TLS o se il TLS negotiaton fallisce, la connessione al server avrà esito negativo.
È possibile raggiungere questo obiettivo il seguente:
Memorizzazione del certificato CA in Keystore
Per memorizzare il certificato in un archivio chiavi attenersi alla seguente procedura.
Passaggio 1: Scarica il file JAR BouncyCastle. Può essere scaricato dal qui: Bouncy Castle JAVA stampa
Passaggio 2: , utilizzare il seguente comando per archiviare il certificato di chiavi
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>"
Passaggio 3: Verifica il file di archivio chiavi
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>"
Questo ci deve elencare il certificato incluso nel keystore.
Abbiamo un archivio di chiavi, che possiamo utilizzare nel nostro codice.
Uso della chiavi
Dopo aver generato questa chiavi, salvarlo nella cartella grezzo della vostra applicazione. L'utilizzo del codice sottostante per ottenere la stretta di mano il certificato con il server Openfire.
Per creare una connessione con openfire utilizzando XMPP, potrebbe essere necessario per ottenere il config. Per lo stesso, utilizzare il seguente metodo:
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; }
Tutto fatto .. !! Basta collegare .. Ora la connessione è protetta.
Tutti seguono lo stesso nel mio blog all'indirizzo smackssl.blogspot.in