Pergunta

Eu estou construindo um programa pequeno que funciona como um cliente XMPP e eu estou usando o biblioteca tapa . Agora, o servidor eu estou conectando a requer SSL (no Pidgin eu tenho que verificar "velha (porta 5223) SSL Force"). Estou tendo problemas para obter Bater para se conectar a este servidor. É possível?

Foi útil?

Solução

Dê uma olhada esta discussão.

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

Essencialmente, você precisa adicionar estas duas linhas ao seu código:

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

onde connConfig é o seu objeto ConnectionConfiguration. Obter o DummySSLSocketFactory a partir do repositório de código-fonte Spark. Tudo que faz é aceitar virtualmente qualquer certificado. Isso parecia trabalho para mim. Boa sorte!

Outras dicas

Sim, é muito fácil de alcançar. Dê uma olhada na ConnectionConfiguration classe, e em particular o método setSecurityMode que aceita uma enumeração ConnectionConfiguration.SecurityMode como parâmetro. Configurando para "necessárias" forças Bater usar TLS.

a partir do Javadoc:

criptografia Securirty via TLS é necessária para se conectar. Se o servidor não oferece TLS ou se o TLS negotiaton falhar, a conexão para o servidor irá falhar.

Você pode conseguir isto, o seguinte:

Guardar o Certificado CA no armazenamento de chaves

Para armazenar o certificado em um armazenamento de chaves siga estes passos.

Passo 1: Baixe o arquivo JAR bouncycastle. Ele pode ser baixado a partir do aqui: Lançamentos Bouncy Castle JAVA

Passo 2: Use o seguinte comando para armazenar o certificado no armazenamento de chaves

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

Passo 3: Verifique se o arquivo de armazenamento de chave

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

Esta deve listar-nos o certificado incluído no armazenamento de chaves.

Temos um armazenamento de chaves que podemos utilizar no nosso código.

Usando o armazenamento de chave

Depois de gerar esse armazenamento de chaves, salve-o na pasta crua de sua aplicação. O uso o código abaixo para obter o aperto de mão certificado com o servidor openfire.

Para criar uma conexão com openfire usando XMPP, pode ser necessário para obter a configuração. Para o mesmo, use o método a seguir:

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

Tudo feito .. !! Basta ligar .. Agora sua conexão é segura.

Todos seguem o mesmo no meu blog em smackssl.blogspot.in

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top