6

XMPPクライアントとして機能する小さなプログラムを作成しており、Smackライブラリを使用しています。現在、接続しているサーバーにはSSLが必要です(Pidginでは、[古い(ポート5223)SSLを強制する]をオンにする必要があります)。Smackをこのサーバーに接続するのに問題があります。出来ますか?

4

3 に答える 3

8

このスレッドを見てください。

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

基本的に、次の2行をコードに追加する必要があります。

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

ここで、connConfigはConnectionConfigurationオブジェクトです。SparkソースコードリポジトリからDummySSLSocketFactoryを取得します。事実上すべての証明書を受け入れるだけです。これは私にとってはうまくいったようです。幸運を!

于 2009-09-29T23:31:16.850 に答える
4

これは、次の方法で実現できます。

キーストアへの CA 証明書の保存

証明書をキーストアに保存するには、次の手順に従います。

ステップ 1: bouncycastle JAR ファイルをダウンロードします。ここからダウンロードできます: 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>"

これにより、キーストアに含まれる証明書が一覧表示されます。

コードで使用できるキーストアがあります。

キーストアの使用

このキーストアを生成したら、アプリケーションの raw フォルダーに保存します。以下のコードを使用して、openfire サーバーとの証明書ハンドシェイクを取得します。

XMPP を使用して openfire との接続を作成するには、構成を取得する必要がある場合があります。同じために、以下の方法を使用します。

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の私のブログでもすべて同じです。

于 2015-10-15T12:05:48.913 に答える
3

はい、達成するのは非常に簡単です。ConnectionConfigurationクラス、特に ConnectionConfiguration.SecurityMode 列挙型をパラメーターとして受け入れる setSecurityMode メソッドを見てください。これを「必須」に設定すると、Smack は TLS を使用するようになります。

Javadoc から:

接続するには、TLS 暗号化によるセキュリティが必要です。サーバーが TLS を提供しない場合、または TLS ネゴシエーションが失敗した場合、サーバーへの接続は失敗します。

于 2009-08-31T22:02:33.723 に答える