尝试使用android Smack客户端库连接到XMPP服务器会抛出CertPathValidatorException

时间:2017-05-26 11:56:08

标签: android certificate xmpp anchor smack

这是我的代码:

    XMPPTCPConnectionConfiguration.Builder connectionBuilder = 
    XMPPTCPConnectionConfiguration.builder();

    connectionBuilder
            .setHost(MY_HOST)
            .setServiceName(MY_SERVICE_NAME)
            .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
            .setDebuggerEnabled(true);


    XMPPTCPConnection connection = new         XMPPTCPConnection(connectionBuilder.build());
    connection.connect();

运行时,我遇到了这个例外:

W/System.err: org.jivesoftware.smack.SmackException: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

有没有人有任何快速解决方案来克服这个问题?我对深入理解SSL协议等不感兴趣。我也不关心项目这个阶段的安全性。

我还想提一下,我使用Swift应用程序成功连接到服务器,因此问题可能不在服务器端。提前谢谢。

3 个答案:

答案 0 :(得分:2)

    // Create a connection to the jabber.org server.
    // Create the configuration for this new connection
    InetAddress addr = null;
    try {
        addr = InetAddress.getByName("192.***.**.**");
    } catch (UnknownHostException e) {
        e.printStackTrace();
    }
    HostnameVerifier verifier = new HostnameVerifier() {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return false;
        }
    };
    DomainBareJid serviceName = null;
    try {
        serviceName = JidCreate.domainBareFrom("localhost");
    } catch (XmppStringprepException e) {
        e.printStackTrace();
    }
    XMPPTCPConnectionConfiguration config = 

XMPPTCPConnectionConfiguration.builder()
                .setUsernameAndPassword(USER_CURRENT_USER, "password")
                .setPort(5222)
                .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                .setXmppDomain(serviceName)
                .setHostnameVerifier(verifier)
                .setHostAddress(addr)
                .setDebuggerEnabled(true)
                .build();

        connection = new XMPPTCPConnection(config);
        try {
            connection.connect();
        } catch (SmackException | IOException | InterruptedException | XMPPException e) {
            e.printStackTrace();
        }

尝试这个,让我知道它是否适合你..

答案 1 :(得分:0)

取消此链接.. XMPPTCPConnectionConfiguration

答案 2 :(得分:0)

您必须将要尝试访问的服务器的证书添加到JDK信任库,或者禁用主机名验证,如上所示。