簡體   English   中英

如何使用Smack XMPP庫創建SSL連接?

[英]How to create an SSL connection using the Smack XMPP library?

我正在構建一個充當XMPP客戶端的小程序,我正在使用Smack庫。 現在,我連接的服務器需要SSL(在Pidgin中我必須檢查“強制舊(端口5223)SSL”)。 我無法讓Smack連接到這台服務器。 可能嗎?

看看這個帖子。

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

基本上,您需要將這兩行添加到您的代碼中:

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

其中connConfig是您的ConnectionConfiguration對象。 從Spark源代碼存儲庫中獲取DummySSLSocketFactory。 它所做的只是接受任何證書。 這似乎對我有用。 祝好運!

是的,它很容易實現。 查看ConnectionConfiguration類,特別是接受ConnectionConfiguration.SecurityMode枚舉作為參數的setSecurityMode方法。 將此設置為“required”會強制Smack使用TLS。

來自Javadoc:

需要Securirty通過TLS加密才能連接。 如果服務器未提供TLS或TLS協議失敗,則與服務器的連接將失敗。

您可以通過以下方式實現此目的:

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

這將列出密鑰庫中包含的證書。

我們有一個密鑰庫,我們可以在代碼中使用它。

使用密鑰庫

生成此密鑰庫后,將其保存在應用程序的原始文件夾中。 使用以下代碼獲取與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中也是如此

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM