5

我读到 ejabberd 建议使用 STARTTLS 协商来实现通信实体之间的安全连接。当我安装 ejabberd 时,默认情况下它带有 TLS 证书。

那么,为什么我需要购买证书才能安装呢?既然我们有默认证书,那么从证书颁发机构购买新证书的目的是什么?

当我在机器上部署 ejabberd 时,默认证书将如何用于我的域?客户端如何验证默认证书?

4

2 回答 2

2

您可以通过提供的 TLS 证书将 ejabberd 与 SSL / STARTTLS 一起使用。但是,该证书只是一个自签名证书。代表着:

  1. 您仍然可以加密客户端和服务器之间的流量。
  2. 您的客户端将无法检查服务器是否是它假装的域。为了能够知道证书可以信任,客户端需要以某种方式引用信任机构。

在第二种情况下,这意味着如果中间网络设备(即 Wifi 接入点)试图冒充您的服务器,它可以向用户提供任何自签名证书,冒充您的域。

因此,您绝对可以使用自签名证书来加密流量,但是为了保护您的用户免受中间人类型的攻击,您需要找到一种方法让客户端现在可以信任该证书。

这可以通过从受信任的机构购买证书(将证明您的证书域)或通过使客户端支持明确定义的证书列表来完成。这称为证书固定,但是它需要将可接受的证书列表构建到您的客户端中,这可能是不可能的。

在您的情况下可能没问题,因此购买证书不是强制性的。但是,即使您计划使用自签名证书,也不要使用默认的 ejabberd 自签名证书。ejabberd 提供的证书与您自己的域不匹配。您至少应该生成与您的实际 XMPP 域匹配的自己的自签名证书:如何使用 openssl 创建自签名证书?

于 2015-07-28T12:14:32.087 回答
1

客户端会验证是否为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
于 2017-07-07T09:30:15.627 回答