È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top