加密通信软件Signal是开源的,安全性很高,号称斯诺登也推荐大家使用。
编译
言归正传,继续说Signal服务端。首先,Signal Server目前的代码是2.92版本,既然有工程文件pom.xml,那就用Maven编译好了。仓库地址是https://github.com/signalapp/Signal-Server/。
mvn install -DskipTests
编译这个版本的代码需要用JDK 11+。编译的最终产物是TextSecureServer-3.21.jar。
寻找别人的安装经验指南
编译好了,接下来要部署了。先谷歌一下关键字Signal Sever + Install/Deploy,引用最多的是一篇1.88版本的安装指南:《Signal Server Installation Guide》。
配置的总入口:模板文件sample.yml
把Signal Server代码仓库中的配置模板文件sample.yaml拿出来,改名为config.yml,按上面这个指南配置,会发现3.21 的配置项有了一些变化。后面的事实会证明,代码仓库中的这个yml模板,是很老的版本,和代码不完全匹配,照这个配几乎无用。
第三方接口的帐号申请
先搜罗一下yml中需要申请的第三方接口的帐号,挨个申请。
要申请的帐号清单:
- Twilio 用于短信等功能。
- S3 亚马逊S3,用于图床CDN、聊天的附件等,自己部署可以用minIO替代。
- SQS 亚马逊SQS,消息队列。
- reCAPTCHA 谷歌reCAPTCHA,用于识别机器人。
- GCM 谷歌推送服务。国内可用极光推送。
- APN 苹果推送服务。
- 谷歌存储
- bigtable 谷歌大数据数据库
配置服务器的域名
没有域名的话,买一个。HTTPS/WSS(WebSocket Secure)服务都是需要校验域名对应的证书的,Twilio服务的反向连接也需要配置域名。
安装Redis
sudo apt-get install -y redis-server
修改配置文件:
sudo vi /etc/redis/redis.conf
重启Redis:
sudo systemctl restart redis.service
安装PostgreSQL
安装数据库软件,创建数据库,创建帐号:
sudo apt-get install postgresql postgresql-contrib -y sudo -u postgres psql -c "CREATE DATABASE accountsdb" sudo -u postgres psql -c "CREATE DATABASE messagedb" sudo -u postgres psql -c "CREATE DATABASE abusedb" sudo -u postgres psql -c "CREATE DATABASE readdb" sudo -u postgres psql -c "CREATE USER signal \ WITH ENCRYPTED PASSWORD 'password'"
修改数据库配置:
sudo vi /etc/postgresql/13/main/postgresql.conf
1、将 listen_addresses='localhost' 改为 listen_addresses='*'
2、启用数据库的密码认证。尾部追加一行,内容为:
host all all 0.0.0.0/0 md5
重启数据库:
sudo systemctl restart postgresql
安装coturn,基于webrtc协议的一个实时语音聊天
开启防火墙tcp和udp的3478端口,udp也要开。
安装
apt-get install libevent-dev apt install certbot python3-certbot-nginx
下载安装github上的coturn
https://github.com/coturn/coturn
安装coturn并生成证书:
openssl req -x509 -newkey rsa:2048 -keyout /etc/turn_server_pkey.pem -out /etc/turn_server_cert.pem -days 99999 -nodes
编辑配置文件:
sudo vi /etc/turnserver.conf
先查找pem文件,然后配置下面的结果附加到文件末尾dh-file字段:
$ sudo find / -name ssl-dhparams.pem /usr/lib/python3/dist-packages/certbot/ssl-dhparams.pem
listening-ip= external-ip=
#放开no-auth测试
no-auth realm=服务器的完整域名 cert=/etc/turn_server_cert.pem pkey=/etc/turn_server_pkey.pem
#放开管理密码 cli-password=
dh-file=/usr/lib/python3/dist-packages/certbot/ssl-dhparams.pem
配置好之后,启动
turnserver -f -c /etc/turnserver.conf
然后用下面的页面测试coturn的基本功能(用谷歌浏览器可能报错701,建议火狐浏览器):
https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/
注意:coturn有两套认证机制,一套是用户名、密码的,一套是共享密钥(secret)。其中共享密钥是给REST接口使用的,Signal Server要用到共享密钥。而测试coturn基本功能时使用的页面只支持用户名+密码的认证方式,而且coturn是优先使用共享密钥的,也就是说如果同时配了共享密钥、用户名+密码的话,在上面这个测试页面中是测试不过的。所以要先禁用共享密钥的设置,等在上面的这个页面中测试通过后,再把共享密钥的配置恢复。
配置好共享密钥后,启动daemon:
turnserver -f -o -c /etc/turnserver.conf
安装Apache2(可nginx替代)
在防火墙上对外开放服务器的80端口,因为获取免费证书时需要回连80端口来验证。
下面用a2enmod打开需要的几种Apache代理模块,用certbot获取域名对应的免费HTTPS证书,最后会提示将80端口重定向到443端口。
sudo apt-get install apache2 sudo a2enmod proxy proxy_http proxy_wstunnel sudo add-apt-repository ppa:certbot/certbot -y sudo apt-get update -y sudo apt-get install python-certbot-apache -y sudo certbot --authenticator standalone --installer apache -d "你的服务器完整域名" --pre-hook "systemctl stop apache2" --post-hook "systemctl start apache2"
编辑Apache的HTTPS站点的配置文件:
sudo vi /etc/apache2/sites-available/000-default-le-ssl.conf
设置反向代理,将Apache的443端口来的客户端请求反向代理到Signal Server的8080端口。443的wss://反向代理到8080的ws://,443的https://反向代理到8080的http://。Signal Server除了用8080端口来监听ws://和http://,还会起一个8081的对内管理端口,可以用浏览器打开http://127.0.0.1:8081查看。
HTTPS站点的配置样本如下:
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin webmaster@excmple.com
DocumentRoot /var/www/html
AllowEncodedSlashes NoDecode
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule .* "ws://localhost:8080$0" [P,L]