我正在尝试配置一个证书以供我的 ejabberd 服务器使用。这不是自签名证书,而是 Comodo 的 PossitiveSSL 颁发的有效期为 1 年的证书。证书尚未过期。
我有 PEM 格式的私钥、.crt 格式的证书和 .ca-bundle 格式的链
在 /opt/ejabberd/conf/ejabberd.yml 中有一行内容:
certfiles:
- /opt/ejabberd/conf/server.example.com.crt
- /opt/ejabberd/conf/server.example.com.ca-bundle
- /opt/ejabberd/conf/privkey.pem
对于 privkey.pem,我不得不删除密码,因为 ejabberd 服务无法启动。它无法读取私钥。
我的问题是:我是否必须有一个 PEM 文件来存储 privkey+cert+chain?
我尝试了这两种方法,对于需要在连接时执行 TLS 的 Gajim 客户端来说,效果是一样的。在这种情况下,在配置中保留三行,每行指向正确的容器会更简单。
无论如何,我有一个 gajim windows XMPP 客户端,它可以很好地连接到服务器所需的 TLS,并且没有错误,并且它正在使用 TLS
当我尝试通过 Android 设备连接另一个 JID 时,收到以下信息:
接受未知证书?服务器证书未由已知证书颁发机构签名。
为什么我会得到这个?虽然在 Android 中我可以选择“始终接受”,但我无论如何都不想这样做,因为我使用的是来自 Authority 的签名证书,但 Apple 设备甚至不提供接受任何内容的选项,并且 TLS 连接中断。
我尝试了多种方法,但 Android 中仍然会弹出此窗口。
此条目是否:
certfiles:
- /opt/ejabberd/conf/server.example.com.crt
- /opt/ejabberd/conf/server.example.com.ca-bundle
- /opt/ejabberd/conf/privkey.pem
全局?意思是如果我在这里指定证书文件,就不需要为每个模块都指定?比如对于 c2S 模块,我是否必须指定证书文件的路径?
listen:
-
port: 5222
module: ejabberd_c2s
##
## If TLS is compiled in and you installed a SSL
## certificate, specify the full path to the
## file and uncomment these lines:
##
## certfile: "/path/to/ssl.pem"
## starttls: true
提前致谢。
答案1
意思是如果我在这里指定 certfiles,我就不必为每个模块都指定?比如对于 c2S 模块,我是否必须指定 cert 文件的路径?
查看文档,它清楚地表明选项 certfiles 是全局的,因此 ejabberd 在其任何模块中获取证书时都会使用它:
全局选项还有一些可以在 ejabberd 配置文件中指定(在 listen 之外)的附加全局选项:
acme:自动化 SSL 证书管理。请参阅 ACME 部分。
certfiles:路径列表:该选项接受包含 PEM 证书或 PEM 私钥的文件路径列表(可选带通配符)。启动时,ejabberd 会对证书进行排序,查找匹配的私钥并重建完整证书链。在侦听器 ejabberd_c2s、ejabberd_s2s 或 ejabberd_http 中启用 starttls 或 tls 等选项时使用此选项。
https://docs.ejabberd.im/admin/configuration/#global-options
此外,还有一些示例配置使用 certfiles 全局选项来定义稍后由特定模块使用的证书:
https://docs.ejabberd.im/admin/configuration/#mod-register-web
https://docs.ejabberd.im/admin/configuration/#mod-http-upload
答案2
感谢您提供的信息和链接。我查看了它们,一切都设置得当。Windows 10 上的 gajim 客户端再次没有出现任何问题,其 JID 安全地连接到服务器。Android 和 Apple 设备会抱怨“服务器证书未由已知证书颁发机构签名”所有客户端都在同一个内部 LAN 上。
不知道还能尝试什么,