【问题标题】:How to use certificates with Smack 4.2如何在 Smack 4.2 中使用证书
【发布时间】:2018-02-23 19:38:50
【问题描述】:

我正在尝试连接到 Blah.im XMPP 服务器,但它需要 SSL/TLS 证书才能连接。我正在使用下面的代码进行连接,但是如何在此连接中使用证书?

 XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.
                                builder()
                                .setHost("jabber.blah.im")
                                .setPort(5222)
                                .setXmppDomain("blah.im")
                                .setUsernameAndPassword(username, password)
                                .setSendPresence(true)
                                .setSecurityMode(SecurityMode.required)
                                .setDebuggerEnabled(true)
                                .build();

 XMPPTCPConnection connection = new XMPPTCPConnection(config);
 connection.connect();
 connection.login();

【问题讨论】:

    标签: android ssl xmpp smack


    【解决方案1】:

    使用下面的代码来配置 SSL/TLC 证书以进行连接。

      try {
            XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder()
                    .setDebuggerEnabled(XMPP_DEBUG_MODE)
                    .setXmppDomain(JidCreate.from(SERVICE_NAME).asDomainBareJid())
                    .setHost(SERVER_NAME)
                    .setPort(5222)
                    .setSendPresence(true)
                    .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
    
            KeyStore keyStore = configKeyStore(builder);
    
            configSSLContext(builder, keyStore);
    
            config = builder.build();
    
        } catch (KeyManagementException | KeyStoreException | NoSuchAlgorithmException | XmppStringprepException e) {
            e.printStackTrace();
        }
    

    //configKey存储

      private KeyStore configKeyStore(XMPPTCPConnectionConfiguration.Builder builder) throws KeyStoreException {
        KeyStore keyStore;
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
            builder.setKeystorePath(null);
            builder.setKeystoreType("AndroidCAStore");
            keyStore = KeyStore.getInstance("AndroidCAStore");
        } else {
            builder.setKeystoreType("BKS");
            keyStore = KeyStore.getInstance("BKS");
    
            String path = System.getProperty("javax.net.ssl.trustStore");
            if (path == null)
                path = System.getProperty("java.home") + File.separator + "etc"
                        + File.separator + "security" + File.separator
                        + "cacerts.bks";
            builder.setKeystorePath(path);
        }
        return keyStore;
    }
    

    //配置ssl上下文

      private void configSSLContext(XMPPTCPConnectionConfiguration.Builder builder, KeyStore keyStore) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException {
        TrustManagerFactory trustManagerFactory = TrustManagerFactory
                .getInstance(KeyManagerFactory.getDefaultAlgorithm());
        trustManagerFactory.init(keyStore);
    
        SSLContext sslContext = SSLContext.getInstance("TLS");
        sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
    
        builder.setCustomSSLContext(sslContext);
    }
    

    【讨论】:

    • 你为什么用setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);
    猜你喜欢
    • 1970-01-01
    • 2015-06-01
    • 1970-01-01
    • 2020-01-26
    • 2022-08-18
    • 2017-12-13
    • 2018-01-12
    • 2011-08-23
    • 2012-01-08
    相关资源
    最近更新 更多