我读到 ejabberd 建议使用 STARTTLS 协商来实现通信实体之间的安全连接。当我安装 ejabberd 时,默认情况下它带有 TLS 证书。
那么,为什么我需要购买证书才能安装呢?既然我们有默认证书,那么从证书颁发机构购买新证书的目的是什么?
当我在机器上部署 ejabberd 时,默认证书将如何用于我的域?客户端如何验证默认证书?
您可以通过提供的 TLS 证书将 ejabberd 与 SSL / STARTTLS 一起使用。但是,该证书只是一个自签名证书。代表着:
在第二种情况下,这意味着如果中间网络设备(即 Wifi 接入点)试图冒充您的服务器,它可以向用户提供任何自签名证书,冒充您的域。
因此,您绝对可以使用自签名证书来加密流量,但是为了保护您的用户免受中间人类型的攻击,您需要找到一种方法让客户端现在可以信任该证书。
这可以通过从受信任的机构购买证书(将证明您的证书域)或通过使客户端支持明确定义的证书列表来完成。这称为证书固定,但是它需要将可接受的证书列表构建到您的客户端中,这可能是不可能的。
在您的情况下可能没问题,因此购买证书不是强制性的。但是,即使您计划使用自签名证书,也不要使用默认的 ejabberd 自签名证书。ejabberd 提供的证书与您自己的域不匹配。您至少应该生成与您的实际 XMPP 域匹配的自己的自签名证书:如何使用 openssl 创建自签名证书?
客户端会验证是否为Jabber ID(JID)的域名颁发证书,即'@'后面的部分。(还有其他选项,但它们与浏览器供应商针对 CA 实施的策略不兼容,因此不实用。)
除非您已经与证书颁发机构 (CA) 建立了业务关系,否则我建议任何人使用Let's Encrypt并远离自签名证书。
可以在此处和链接的 wiki 页面中找到一些自动执行此操作并对 Let's Encrypt 服务器友好的说明。
摘要(假设您正在运行 Ubuntu 16.04 LTS,希望在域example.org上运行它并且只使用ejabberd的证书):
/usr/local/sbin/auto-renew-letsencrypt
使用以下内容创建:
#!/bin/bash # 更新所有需要更新的 Let's Encrypt 证书 t=`mktemp` # 尽量保持安静,除非返回错误 让加密更新 > $t || 猫$t # Ubuntu 16.04 LTE 附带的 `letsencrypt` 尚不支持挂钩 # 粗略地模拟 --renew-hook; 如果诊断消息发生变化则中断 if grep -q "以下证书已更新" $t; 然后 cat /etc/letsencrypt/live/example.org /{privkey,fullchain}.pem > /etc/ejabberd/ejabberd.pem 服务 ejabberd 重新加载 菲 rm$t
运行以下命令创建并激活证书和自动续订
apt install 让加密 Letencrypt 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