Как создать SSL-соединение с помощью библиотеки Smack XMPP? - PullRequest
6 голосов
/ 13 февраля 2009

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

Ответы [ 3 ]

6 голосов
/ 30 сентября 2009

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

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

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

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

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

3 голосов
/ 01 сентября 2009

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

из Javadoc:

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

2 голосов
/ 15 октября 2015

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

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

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

Шаг 1: Загрузите файл JAR bouncycastle. Его можно скачать здесь: Bouncy Castle JAVA Releases

Шаг 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>"

В нем будет указан сертификат, включенный в хранилище ключей.

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

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

После создания этого хранилища ключей сохраните его в сырой папке вашего приложения. Используйте приведенный ниже код для получения подтверждения сертификата с сервером 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...