我读到ejabberd建议使用STARTTLS协商来实现通信实体之间的安全连接。当我安装ejabberd时,默认情况下它附带一个TLS证书。
然后,为什么我需要购买证书才能安装?由于我们有默认证书,因此从Certificate Authoririty购买新证书的目的是什么?
当我在机器上部署ejabberd时,默认证书将如何用于我的域?客户端如何验证默认证书?
答案 0 :(得分:2)
您可以将ejabberd与SSL / STARTTLS一起使用提供的TLS证书。但是,该证书只是一个自签名证书。这意味着:
在第二种情况下,这意味着如果中间网络设备(即Wifi接入点)尝试模拟您的服务器,它可以向用户提供任何自签名证书,假装是您的域。
因此,您绝对可以使用自签名证书加密流量,但为了保护您的用户免受中间人攻击,您需要找到一种方法让客户端现在可以信任该证书
这可以通过从受信任的机构购买证书(将证明您的证书域)或通过使客户端支持明确定义的证书列表来完成。这称为证书锁定,但是它需要在客户端中构建可接受的证书列表,这可能是不可能的。
在您的情况下可能没问题,因此购买证书不是强制性的。 但是,即使您计划使用自签名证书,也不要使用默认的ejabberd自签名证书。随ejabberd提供的证书与您自己的域名不符。您至少应该生成与您的实际XMPP域匹配的自签名证书:How to create a self-signed certificate with openssl?
答案 1 :(得分:1)
客户端将验证是否为Jabber ID(JID)的域名(“@”后面的部分)颁发了证书。 (还有其他选择,但它们与浏览器供应商针对CA实施的策略不兼容,因此不实用。)
除非您已与证书颁发机构(CA)建立了业务关系,否则我建议任何人使用Let's Encrypt并远离自签名证书。
可以找到一些自动执行此操作并对Let的加密服务器很好的说明here和链接的Wiki页面。
摘要(假设您运行的是Ubuntu 16.04 LTS,希望在域 example.org 上运行它,并且仅使用 ejabberd 的证书):
使用以下内容创建/usr/local/sbin/auto-renew-letsencrypt
:
#!/bin/bash # Renew all Let's Encrypt certificates which are due for renewal t=`mktemp` # Try to be quiet unless an error is returned letsencrypt renew > $t || cat $t # Hooks are not yet supported by `letsencrypt` shipping with Ubuntu 16.04 LTE # Crudely emulate --renew-hook; breaks if diagnostic messages change if grep -q "The following certs have been renewed" $t; then cat /etc/letsencrypt/live/example.org/{privkey,fullchain}.pem > /etc/ejabberd/ejabberd.pem service ejabberd reload fi rm $t
运行以下命令以创建和激活证书以及自动续订
apt install letsencrypt letsencrypt certonly --standalone --domain example.org cat /etc/letsencrypt/live/example.org/{privkey,fullchain}.pem > /etc/ejabberd/ejabberd.pem chown ejabberd:ejabberd /etc/ejabberd/ejabberd.pem chmod 640 /etc/ejabberd/ejabberd.pem chmod 755 /usr/local/sbin/auto-renew-letsencrypt echo $(($RANDOM % 60)) $((RANDOM % 6)) "* * * root /usr/local/sbin/auto-renew-letsencrypt" > /etc/cron.d/auto-renew-letsencrypt