Wie eine SSL-Verbindung mit der Smack XMPP-Bibliothek erstellen?
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?
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