スマックXMPPライブラリを使用してSSL接続を作成するには?
解決
このスレッドを見てみましょう。
http://www.igniterealtime.org/community/thread/37678する
基本的に、あなたのコードに次の2行を追加する必要があります:
connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
connConfig.setSocketFactory(new DummySSLSocketFactory());
connConfigは、あなたのConnectionConfigurationオブジェクトです。スパークソースコードリポジトリからDummySSLSocketFactoryを取得します。それがないすべては、事実上すべての証明書を受け入れています。これは私のために働くように見えました。幸運!
他のヒント
はい、それは達成するのは非常に簡単です。 ConnectionConfiguration を見てみましょうパラメータとしてConnectionConfiguration.SecurityMode列挙を受け入れる>クラス、特にsetSecurityMode方法。これを設定すると、力がTLSを使用するためにスマック「必要」します。
のJavadocから:
Securirty TLS経由で暗号化され 接続するために必要。もし サーバがTLSを提供する場合、またはしません TLSのnegotiatonは、接続に失敗しました サーバーに失敗します。
あなたは以下のことで、これを達成することができます:
を保存するキーストアにCA証明書の
キーストアに証明書を保存するには次の手順に従います。
のステップ1:のはBouncyCastle 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>"
これは私たちに、キーストアに含まれた証明書を列挙しなければならない。
私たちは、我々のコードで使用できるキーストアを持っています。
をキーストアを使用するの
このキーストアを生成した後、あなたのアプリケーションの生のフォルダに保存します。 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; }
すべて行って..!ちょうど今、あなたの接続が確保されている...接続します。