Как создать SSL-соединение с помощью библиотеки Smack XMPP?

StackOverflow https://stackoverflow.com/questions/545082

  •  23-08-2019
  •  | 
  •  

Вопрос

Я создаю небольшую программу, которая действует как клиент XMPP, и использую Хлопать библиотека.Теперь сервер, к которому я подключаюсь, требует SSL (в Pidgin мне нужно проверить «Принудительно использовать старый (порт 5223) SSL»).У меня возникли проблемы с подключением Smack к этому серверу.Является ли это возможным?

Это было полезно?

Решение

Взгляните на эту тему.

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

По сути, вам нужно добавить в свой код эти две строки:

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

где connConfig — ваш объект ConnectionConfiguration.Получите DummySSLSocketFactory из репозитория исходного кода Spark.Все, что он делает, это принимает практически любой сертификат.Кажется, это сработало для меня.Удачи!

Другие советы

Да, этого довольно легко достичь.Взгляните на Конфигурация соединения класс и, в частности, метод setSecurityMode, который принимает перечисление ConnectionConfiguration.SecurityMode в качестве параметра.Установка этого параметра на «обязательный» заставляет Smack использовать TLS.

из Javadoc:

Безопасность через шифрование TLS - это требуется для подключения.Если сервер не поддерживает TLS или если Переговоры по TLS не удаются, соединение к серверу не удастся.

Вы можете добиться этого следующим образом:

Хранение сертификата CA в хранилище ключей

Чтобы сохранить сертификат в хранилище ключей, выполните следующие действия.

Шаг 1: Загрузите JAR-файл надувного замка.Его можно скачать отсюда:Надувной замок JAVA-релизы

Шаг 2: Используйте следующую команду для сохранения сертификата в хранилище ключей

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

Шаг 3: Проверьте файл хранилища ключей

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

Это покажет нам сертификат, включенный в хранилище ключей.

У нас есть хранилище ключей, которое мы можем использовать в нашем коде.

Использование хранилища ключей

После создания этого хранилища ключей сохраните его в папке raw вашего приложения.Используйте приведенный ниже код, чтобы получить подтверждение сертификата с сервером openfire.

Чтобы создать соединение с openfire с помощью XMPP, вам может потребоваться получить конфиг.Для того же используйте метод ниже:

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

Все сделано..!!Просто подключитесь.Теперь ваше соединение защищено.

Все следуют тому же в моем блоге по адресу smackssl.blogspot.in

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top