一、先来一波tigase装逼简介
tigase 完全实现了XMPP协议,除了全面实施的两个核心协议,它支持大多数的你可能永远都需要的扩展协议。Tigase是开源的,如果你有有那能力,你可以定制自己的XMPPServer,虽然经过了很多次测试,但是仍然有可能有bug,你可以修补bug并提交代码到官方
二、使用docker搭建tigase-server
安装tigase-server之前首先需要一个mysql
首先拉取镜像
docker pull tigase/tigase-xmpp-server ##拉取镜像
docker run -d --name tigase-server --link mysql:mysql -p 30001:5290 -p 30002:8080 -p 30003:5222 tigase/tigase-xmpp-server ##启动tigase-server
然后访问 http://ip:port 进去setup界面,账号admin 密码tigase
然后一直下一步,最后重启tigase-server
然后再次进去系统
创建虚拟域
三、配置TLS证书
这里直接使用openssl来生成证书
openssl req -nodes -new -newkey rsa:2048 -keyout qhliao.im.key -out qhliao.im.csr
这一步会让你输入一个密码,一定要记住这个密码,并且common name 是你虚拟域的名字,比如我这个就是qhliao.im
openssl x509 -req -days 365 -in qhliao.im.csr -signkey qhliao.im.key -out qhliao.im.crt
cat qhliao.im.crt qhliao.im.key > qhliao.im.pem
转换为pkcs12
openssl pkcs12 -export -out qhliao.im.p12 -inkey qhliao.im.key -in qhliao.im.crt
转换为jks
keytool -importkeystore -srckeystore qhliao.im.p12 -srcstoretype PKCS12 -deststoretype JKS -destkeystore qhliao.im.jks
然后把 qhliao.im.pem文件复制到 tigase-server目录里面的 certs里面 docker的话执行下面命令
docker cp qhliao.im.pem tigase-server:/home/tigase/tigase-server/certs
然后重启tigase
docker restart tigase-server
至此服务器配置好了,下面开始客户端连接,这里演示Smack连接服务器 和 Spark客户端连接服务器
四、Smack连接
首先导入maven依赖
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-java8</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-tcp</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-im</artifactId>
<version>4.4.0</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack-extensions</artifactId>
<version>4.4.0</version>
</dependency>
把刚刚生成的证书 qhliao.im.jks类型的复制到项目的根目录 然后代码
public static AbstractXMPPConnection connection() {
try {
SSLContext ctx = SSLContext.getInstance("SSL");
TrustManagerFactory tmf = TrustManagerFactory.getInstance("X509");
KeyStore tks = KeyStore.getInstance("JKS");
tks.load(XmppTest.class.getResourceAsStream("/qhliao.im.jks"), "你刚刚的密码".toCharArray());
tmf.init(tks);
ctx.init(null, tmf.getTrustManagers(), null);
XMPPTCPConnectionConfiguration configuration = XMPPTCPConnectionConfiguration.builder()
.setHost("ip").setPort(30003)
.setXmppDomain("qhliao.im")
.setSendPresence(true)
.setCompressionEnabled(false)
.setSslContextFactory(() -> ctx)
.setSecurityMode(ConnectionConfiguration.SecurityMode.required)
.setResource("Smack")
.setCustomX509TrustManager(new X509TrustManager() {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType) {
}
})
.build();
XMPPTCPConnection xmppConnection = new XMPPTCPConnection(configuration);
xmppConnection.connect();
return xmppConnection;
} catch (Exception e) {
log.error("链接失败");
log.error(ExceptionUtils.getStackTrace(e));
}
return null;
}
//然后连接
AbstractXMPPConnection connection = connection();
try {
if (connection != null && connection.isConnected()) {
connection.login("langshi", "langshi");
}
} catch (Exception e) {
log.error("报错啊拉啊啊");
log.error(ExceptionUtils.getStackTrace(e));
connection.disconnect();
}
五、使用Spark连接 首先下载Spark xmpp.org/software/cl…
为Spark安装证书
选择刚刚生成的 qhliao.im.crt 新增 然后 确定保存,
如果没有配置域名 则需要
然后保存 新建账号
最后就可以登录了