我正在构建一个充当XMPP客户端的小程序,我正在使用Smack库。现在,我连接的服务器需要SSL(在Pidgin中,我必须检查“Force old(port 5223)SSL”)。我无法让Smack连接到此服务器。可能吗?如何使用Smack XMPP库创建SSL连接?
回答
看看这个帖子。
http://www.igniterealtime.org/community/thread/37678
本质上讲,你需要将以下两行添加到您的代码:
connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.enabled);
connConfig.setSocketFactory(new DummySSLSocketFactory());
其中connConfig是你ConnectionConfiguration对象。从Spark源代码库获取DummySSLSocketFactory。它所做的只是接受任何证书。这似乎对我有用。祝你好运!
是的,这很容易实现。请看ConnectionConfiguration类,特别是接受ConnectionConfiguration.SecurityMode枚举作为参数的setSecurityMode方法。将其设置为“必需”将强制Smack使用TLS。
从的Javadoc:
Securirty通过TLS加密需要以连接 。如果 服务器不提供TLS或如果TLS协商失败,则连接 到服务器将失败。
您可以通过以下实现:
在密钥库
存放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>"
这将列出我们包含在密钥库中的证书。
我们有一个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
什么是“上下文”和“R”类? – 2016-03-30 13:58:52
- 1. Smack XMPP android连接崩溃
- 2. smack xmpp库Java
- 3. 在应用程序中保持XMPP连接(使用smack)
- 4. 快速blox使用Smack库连接
- 5. XMPP Smack - 如何检查连接是活动还是中断?
- 6. 如何保持与Smack XMPP的连接活跃?
- 7. Smack XMPP连接不通过4G网络连接
- 8. 如何使用TSL/SSL连接xmpp服务器?
- 9. 如何使用java中的Smack XMPP库处理TLS证书
- 10. 如何使用Smack接收传入的XMPP消息?
- 11. 如何在Android中创建服务与XMPP服务器保持Xmpp连接?
- 12. 如何使用SO_KEEPALIVE在PHP中创建SSL连接?
- 13. 使用smack创建MUC
- 14. XMPP Smack API RosterListener +数据库更改
- 15. JavaFX使用Smack API从Java回调(xmpp)
- 16. 使用authToken验证Google Talk(XMPP,Smack)
- 17. 试图通过Smack连接XMPP服务器并获取错误
- 18. 创建多个SSL连接池
- 19. 如何使SSL连接(iphone)
- 20. 如何在XMPP SMACK库中获取服务器时间
- 21. 使用smack连接到Google Talk
- 22. 我在创建使用smack的XMPP客户端时遇到困难4.2 Openfire
- 23. 如何使用Smack与Android Studio与Openfire XMPP服务器联网
- 24. 如何使用Smack XMPP API处理(失败的)登录尝试
- 25. 如何使用WinApi创建连接点?
- 26. 如何使用cygwin创建连接?
- 27. 如何使用MySQL Admin创建连接?
- 28. 如何使用SSL连接到ApacheDS?
- 29. XMPP Jabberd2连接问题
- 30. 如何创建XMPP帐户?
这DummySSLSocketFactory允许任何证书的过去,即使它过期或不通过根CA烧焦所以我建议获取CA证书并将其存储在KeyStore中并将其添加到应用程序中并使用它。请参阅我的答案了解更多详情。 – Iqbal 2015-10-15 11:57:00