Frage

Ich baue ein kleines Programm, das als XMPP-Client fungiert, und ich bin mit dem Smack Bibliothek. Nun wird der Server ich anschließe erfordert SSL (in Pidgin muss ich überprüfen „Force alt (Port 5223) SSL“). Ich habe Probleme Smack immer mit diesem Server zu verbinden. Ist es möglich?

War es hilfreich?

Lösung

Werfen Sie einen Blick auf diesen Thread.

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

Im Wesentlichen müssen Sie diese zwei Zeilen Code hinzuzufügen:

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

wo connConfig ist Ihr ConnectionConfiguration Objekt. Holen Sie sich das DummySSLSocketFactory aus der Spark-Quellcode-Repository. Denn es macht nicht so gut wie jedes Zertifikat akzeptieren. Dies schien für mich zu arbeiten. Viel Glück!

Andere Tipps

Ja, es ist ganz einfach zu erreichen. Schauen Sie sich die ConnectionConfiguration Klasse, insbesondere das Verfahren, die ein setSecurityMode ConnectionConfiguration.SecurityMode ENUM als Parameter akzeptiert. Die Einstellung auf „erforderlich“ Kräfte Smack TLS zu verwenden.

vom Javadoc:

  

Securirty über TLS-Verschlüsselung   erforderlich, um zu verbinden. wenn die   Server bietet nicht TLS oder wenn die   TLS negotiaton fehlschlägt, die Verbindung   auf dem Server fehl.

Sie können dies erreichen durch:

Speichern von CA-Zertifikat auf Schlüsselspeicher

Um das Zertifikat zu speichern, in einem Schlüsselspeicher folgende Schritte aus.

Schritt 1: Laden Sie die bouncycastle JAR-Datei. Es kann von der hier heruntergeladen werden: Hüpfburg JAVA Mitteilungen

Schritt 2: Mit dem folgenden Befehl, um das Zertifikat im Schlüsselspeicher zum Speichern von

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

Schritt 3: Überprüfen Sie die Schlüsselspeicherdatei

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

Dies gilt Liste uns das Zertifikat in den Schlüsselspeicher enthalten.

Wir haben einen Schlüsselspeicher, die wir in unserem Code verwenden können.

Mit dem Schlüsselspeicher

Mit diesen Schlüsselspeichern Nach der Erzeugung es im rohen Ordner Ihrer Anwendung speichern. Die Verwendung der folgenden Code, um das Zertifikat Handshake mit dem Openfire zu erhalten.

Um eine Verbindung zu schaffen mit Openfire XMPP verwenden, müssen Sie die Konfiguration erhalten. Aus dem gleichen, benutzen Sie das folgende Verfahren:

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

Alles fertig .. !! Einfach anschließen .. Jetzt ist Ihre Verbindung gesichert ist.

Alle folgen dem gleichen in meinem Blog unter smackssl.blogspot.in

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top