【问题标题】:TLS certificate installation in ejabberd for STARTTLS negotiation在 ejabberd 中安装 TLS 证书以进行 STARTTLS 协商
【发布时间】:2015-10-18 21:29:01
【问题描述】:

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

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

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

【问题讨论】:

标签: ssl xmpp ejabberd starttls


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • @Michael 很好的解释。为什么您建议不要使用 ejabberd 证书?这背后有什么具体原因吗?
  • 提供的自我证书使用通用域,而不是您的实际域。最好至少在证书中使用您自己的域。
【解决方案2】:

客户端会验证是否为Jabber ID(JID)的域名颁发证书,即'@'后面的部分。 (还有其他选择,但它们与浏览器供应商针对 CA 实施的策略不兼容,因此不实用。)

除非您已经与证书颁发机构 (CA) 建立了业务关系,否则我建议任何人使用 Let's Encrypt 并远离自签名证书。

可以在here 和链接的 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 installletsencrypt
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

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多