Ich baue ein kleines Programm, das als XMPP-Client fungiert, und ich verwende die Smack-Bibliothek. Jetzt benötigt der Server, zu dem ich mich verbinde, SSL (in Pidgin muss ich "Force alt (Port 5223) SSL" überprüfen). Ich habe Probleme, Smack dazu zu bringen, sich mit diesem Server zu verbinden. Ist es möglich?Wie erstellt man eine SSL-Verbindung mit der Smack XMPP-Bibliothek?
Antwort
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!
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.
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
Was sind die Klassen "Context" und "R"? –
@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
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. –
- 1. Wie erstellt man eine Datenquelle mit camel?
- 2. Wie man eine Fremdschlüsselreferenz mit sqlalchemy erstellt
- 3. Wie erstellt man eine ScrollView mit Swift?
- 4. Wie erstellt man eine Anwendung mit TypeScript?
- 5. Wie erstellt man eine Zertifikatskette mit keytool?
- 6. Wie erstellt man eine Masterseite mit HTML?
- 7. Wie erstellt man eine Projektvorlage
- 8. Wie erstellt man eine Metaklasse?
- 9. Wie erstellt man eine Binärdatei
- 10. Wie man Ejabberd Verbindung mit Smack Client Android machen?
- 11. Wie erstellt man eine Konstruktorfunktion?
- 12. Wie erstellt man eine Animation wie diese?
- 13. Wie erstellt man eine mit Kappen versehene Kollektion mit Mungo?
- 14. Wie erstellt man eine Heatmap mit Nummern mit Leaflet Map?
- 15. Wie erstellt man eine Prestashop 1.6 Vorlage?
- 16. Wie erstellt man eine Instanz der Klasse File?
- 17. Wie erstellt man eine Td mit Colspan-Attribut mit wffweb?
- 18. Wie erstellt man eine PUT Anfrage in der ION Bibliothek
- 19. Wie erstellt man eine SaaS-Anwendung?
- 20. Wie erstellt man dynamisch eine Umgebungsvariable?
- 21. Wie erstellt man eine gewichtete Adjazenzliste/Matrix aus der Kantenliste?
- 22. Wie erstellt man eine Dropdown-Liste in der mvc3-Anwendung?
- 23. Wie erstellt man eine Referenz in Loopback?
- 24. Wie erstellt man eine WMI-Eigenschaft dynamisch?
- 25. Wie erstellt man eine Bean in ActionScript?
- 26. Wie erstellt man eine Datei applicationhost.config
- 27. Wie man eine mittelgroße MVC-Anwendung erstellt
- 28. Wie erstellt man eine heterogene boost :: map?
- 29. Wie erstellt man eine Liste von Zufallszahlen
- 30. Wie erstellt man eine Unterklasse in C#?
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