Всем привет, я очень начинающий и пытаюсь написать простой 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 сертификат если конечно дело вообще в нем. Ищу ищу , но очень плохо понимаю пока, что данную тематику )))
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости