在ejabberd中安装TLS证书以进行STARTTLS协商

时间:2015-07-28 11:01:19

标签: ssl xmpp ejabberd starttls

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

然后,为什么我需要购买证书才能安装?由于我们有默认证书,因此从Certificate Authoririty购买新证书的目的是什么?

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

2 个答案:

答案 0 :(得分:2)

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

  1. 您仍然可以加密客户端和服务器之间的流量。
  2. 您的客户端将无法检查服务器是否是它假装的域。为了能够知道证书可以信任,客户端需要以某种方式引用信任机构。
  3. 在第二种情况下,这意味着如果中间网络设备(即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