2009-02-13 5 views

Antwort

7

Schauen Sie sich diesen Thread an.

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 Objekt Ihrer ConnectionConfiguration ist. Rufen Sie die DummySSLSocketFactory aus dem Spark-Quellcode-Repository ab. Alles, was es tut, ist praktisch jedes Zertifikat zu akzeptieren. Dies schien für mich zu funktionieren. Viel Glück!

+1

Diese DummySSLSocketFactory ermöglicht es jedem Zertifikat Vergangenheit, auch wenn es abgelaufen ist oder nicht von einer Stammzertifizierungsstelle versengt Daher empfehle ich den Ansatz, das CA-Zertifikat zu erhalten und es in KeyStore zu speichern und es in der Anwendung hinzuzufügen und dasselbe zu verwenden. Bitte beziehen Sie sich auf die Antwort von mir für weitere Details. – Iqbal

3

Ja, es ist ziemlich einfach zu erreichen. Sehen Sie sich die Klasse ConnectionConfiguration an, insbesondere die Methode setSecurityMode, die eine ConnectionConfiguration.SecurityMode-Enumeration als Parameter akzeptiert. Wenn Sie dies auf "erforderlich" setzen, wird Smack gezwungen, TLS zu verwenden.

vom Javadoc:

Securirty über TLS-Verschlüsselung wird, um eine Verbindung erforderlich. Wenn der Server TLS nicht anbietet oder wenn der TLS-Vorgang fehlschlägt, schlägt die Verbindung mit dem Server fehl.

3

Sie können dies erreichen durch:

CA-Zertifikat auf Schlüsselspeicher speichern

das Zertifikat in einem Schlüsselspeicher diesen Schritten folgen zu speichern.

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

Schritt 2: Verwenden Sie den folgenden Befehl in das Zertifikat speichern Schlüsselspeicher

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üsselspeicher Datei

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 soll uns das im Keystore enthaltene Zertifikat auflisten.

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

den Schlüsselspeicher verwenden

Nach diesen Schlüsselspeicher zu erzeugen, ist es im rohen Ordner Ihrer Anwendung speichern. Verwenden Sie den folgenden Code, um den Zertifikat-Handshake mit dem Openfire-Server zu erhalten.

Um eine Verbindung mit Openfire mit XMPP zu erstellen, müssen Sie möglicherweise die Konfig. 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; 
} 

Fertig .. !! Einfach verbinden .. Jetzt ist Ihre Verbindung gesichert.

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

+0

Was sind die Klassen "Context" und "R"? –

+0

@Alastair 'Context' ist der Kontext auf Anwendungs- oder Klassenebene, den Sie mit' this' übergeben können. Und "R" ist eine Klasse, aus der ich die Schlüsselspeicher auf meiner Festplatte im rohen Verzeichnis abspeicherte. Sie können diese Ressource auch auf andere Weise direkt an den Eingang übergeben. – Iqbal

+0

Klingt, als ob Sie in einem bestimmten Rahmen arbeiten. Android? Ich bin es nicht, also verwirrte mich das nur ein bisschen. Aber ich habe es herausgefunden. Danke trotzdem. –

Verwandte Themen