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. –
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