Java XMPP client Smack 4.2.4 <bad-auth/>

256
10 сентября 2018, 12:10

Всем привет, я очень начинающий и пытаюсь написать простой jabber клиент для получения сообщений, и их последующего анализа. Вот мой код:

package jabberIL;
    import java.io.IOException;
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.lang.InterruptedException;
    import java.net.InetAddress;
    import javax.net.ssl.HostnameVerifier;
    import javax.net.ssl.SSLSession;
    import org.jivesoftware.smack.ConnectionConfiguration;
    import org.jxmpp.jid.DomainBareJid;
    import org.jxmpp.jid.EntityBareJid;
    import org.jxmpp.jid.impl.JidCreate;
    import org.jxmpp.stringprep.XmppStringprepException;
    import org.jivesoftware.smack.tcp.XMPPTCPConnection;
    import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
    import org.jivesoftware.smack.SmackException;
    import org.jivesoftware.smack.XMPPException;
    import org.jivesoftware.smack.AbstractXMPPConnection;
    import org.jivesoftware.smack.packet.Message;
    import org.jivesoftware.smack.chat2.ChatManager;
    import org.jivesoftware.smack.chat2.Chat;
    import org.jivesoftware.smack.chat2.IncomingChatMessageListener;
    import jabberIL.X509_Trust_Manager;
    import javax.net.ssl.SSLContext;
    import java.security.SecureRandom;
    import javax.net.ssl.TrustManager;
    public class JabberIL { 
        public static void main(String[] args) throws XmppStringprepException, SmackException, XMPPException, IOException, InterruptedException  {
            String msg;
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            InetAddress addr = InetAddress.getByName("ip_server"); 
            HostnameVerifier verifier = new HostnameVerifier() {
                    public boolean verify(String hostname, SSLSession session) {
                        return false;  // false 
                    }
            };

            SSLContext Cur_SSL_Context = null;
            try {
                Cur_SSL_Context = SSLContext.getInstance("TLS");
                Cur_SSL_Context.init(null, new TrustManager[] { new X509_Trust_Manager() }, new SecureRandom());
            } catch (Exception e) {
                e.printStackTrace();
            }
            DomainBareJid serviceName = JidCreate.domainBareFrom("name_server.ru"); 
            XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder()                    
                        .setUsernameAndPassword("name","pass") 
                        .setPort(5222)
                        .setSecurityMode(ConnectionConfiguration.SecurityMode.disabled)
                        .setXmppDomain(serviceName)
                        .setHostnameVerifier(verifier)
                        //.setSocketFactory(Cur_SSL_Context.getSocketFactory())
                        .setHostAddress(addr)
                        .setDebuggerEnabled(true)   
                        .setSendPresence(true)
                        .build();
            AbstractXMPPConnection conn1 = new XMPPTCPConnection(config);       
            conn1.connect();
            if(conn1.isConnected()){
                System.out.println("XMPP Connected");
            }   
            conn1.login();          
            ChatManager chatManager = ChatManager.getInstanceFor(conn1);    
            chatManager.addIncomingListener(new IncomingChatMessageListener() {
                public void newIncomingMessage(EntityBareJid from, Message message, Chat chat) {                
                    System.out.println("Received message: " + message.getBody());
                }
            });
            Chat chat = chatManager.chatWith(JidCreate.entityBareFrom("to_name@server.ru"));
            while (!(msg = br.readLine()).equals("bye")) {
                chat.send(msg);
            }           
            //conn1.disconnect(); 
        }
    }

Класс X509_Trust_Manager:

package jabberIL;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;
import java.security.cert.CertificateException; 
public class X509_Trust_Manager implements X509TrustManager {
    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {      
    }
    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {      
    }
    public X509Certificate[] getAcceptedIssuers()  {
        return null;
    }
}

В моем коде один из set, как видно, закомментирован. То есть не учитывается блок с Cur_SSL_Context. Так вот данный код рабочий, например: удачный коннект к jabber.ru и чат с другим ником с этого же сервера(второй ник коннектится через "нормальное" приложение клиент (Wime)). Но у меня есть другой сервер в локальной корпоративной сети. Так вот при коннекте к нему сам по себе connect происходит успешно (судя по сообщению в консоли XMPP Connected), но какая-то беда с авторизацией, так как получаю от сервера вот что:

23:10:45 RECV (0): <failure> xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><bad-auth/> </failure>

при том, что естественно name и pass верные. Когда я к этому серверу коннекчусь через "нормальный" jabber клиент, то получаю при первом коннекте сообщение о self-signed сертификате и принятием решения что с этим делать. Я так понимаю, что проблема кроется именно в этом при попытке коннекта с самописного клиента? Исходя из этого я попробовал блок кода, найденный где-то в сети, как раз если раскомментить строку с .setSocketFactory(Cur_SSL_Context.getSocketFactory()) но тогда при попытке коннекта у меня идет ошибка тайм аута:

Exception in thread "main" org.jivesoftware.smack.SmackException$NoResponseExcep tion: No response received within reply timeout. Timeout was 5000ms (~5s). While waiting for establishing TLS

Подскажите пожалуйста как научить мою программку принимать этот self-signed сертификат если конечно дело вообще в нем. Ищу ищу , но очень плохо понимаю пока, что данную тематику )))

READ ALSO
Ошибка подключения к вебсокету

Ошибка подключения к вебсокету

Хочу подрубиться к вебсокету по логин паролюРугается на tls

216
функция findShort(s)

функция findShort(s)

Дается строка из словНужна длина самого короткого слова

215
Можно ли запустить скрипт, как программу?

Можно ли запустить скрипт, как программу?

Имея javascript файл, могу ли я запустить его не в браузере? Как программу или что-то похожееБез использования node и других ему подобных

220
js на айфоне работает не корректно

js на айфоне работает не корректно

На компьютере и андроид смартфонах всё работает как нужноПри нажатии или наведении на блок, анимируется картинка внутри него

256