使用tigase-server搭建私有聊天服务器

2,522 阅读2分钟

一、先来一波tigase装逼简介

tigase 完全实现了XMPP协议,除了全面实施的两个核心协议,它支持大多数的你可能永远都需要的扩展协议。Tigase是开源的,如果你有有那能力,你可以定制自己的XMPPServer,虽然经过了很多次测试,但是仍然有可能有bug,你可以修补bug并提交代码到官方

二、使用docker搭建tigase-server

参考地址:tigase.net/tigase-meet…

安装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

image.png

image.png

image.png

image.png

然后一直下一步,最后重启tigase-server

然后再次进去系统

image.png

创建虚拟域

image.png

三、配置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…

image.png

为Spark安装证书

image.png

image.png 选择刚刚生成的 qhliao.im.crt 新增 然后 确定保存, 如果没有配置域名 则需要

image.png

然后保存 新建账号

image.png

最后就可以登录了

image.png