升级Mosquitto至2.0.15后无法启动,SSL配置故障排查
问题概述
在Ubuntu 18.04上将Mosquitto从1.4.15升级至2.0.15后,包含SSL加密的原有配置导致服务启动失败,移除SSL相关配置后服务可正常运行。日志显示核心错误为无法加载指定路径下的CA证书和服务器证书,提示文件不存在或无法访问。
疑问解答与解决方案
1. 为何钩子仅复制两个证书文件?
Let's Encrypt颁发的证书中,server.pem是合并了服务器证书和CA证书链的完整文件,因此无需单独提供cafile指定的CA证书。官方的mosquitto-copy.sh钩子针对Let's Encrypt场景设计,只需复制私钥server.key和合并后的证书server.pem即可满足Mosquitto 2.x的SSL配置需求。
旧版本Mosquitto 1.4可能需要分开配置CA证书和服务器证书,但2.x版本支持读取包含完整链的证书文件,无需拆分。
2. 修改配置解决启动故障的步骤
步骤1:更新SSL监听配置路径
原配置中证书路径指向/home/pi/ssl-cert-mosq/,但该目录属于pi用户,Mosquitto服务运行的mosquitto用户无访问权限,且你已通过钩子将证书同步到/etc/mosquitto/certs/,因此需修改mosquitto.conf中的SSL监听部分:
替换原SSL配置:
## SSL access listener 8883 cafile /home/pi/ssl-cert-mosq/mosq-ca.crt certfile /home/pi/ssl-cert-mosq/mosq-serv.crt keyfile /home/pi/ssl-cert-mosq/mosq-serv.key
为:
## SSL access listener 8883 # server.pem已包含CA证书链,无需单独指定cafile certfile /etc/mosquitto/certs/server.pem keyfile /etc/mosquitto/certs/server.key # 若需强制指定CA文件,可指向同一个server.pem # cafile /etc/mosquitto/certs/server.pem
步骤2:保留必要的全局配置
确保配置中包含per_listener_settings true和allow_anonymous false(若需禁用匿名访问),完整的可运行配置示例:
per_listener_settings true allow_anonymous false ## local access listener 1883 password_file /etc/mosquitto/passwd pid_file /var/run/mosquitto.pid persistence true persistence_location /var/lib/mosquitto/ log_dest file /var/log/mosquitto/mosquitto.log include_dir /etc/mosquitto/conf.d ## SSL access listener 8883 certfile /etc/mosquitto/certs/server.pem keyfile /etc/mosquitto/certs/server.key
步骤3:验证证书权限
你已设置证书目录权限为mosquitto用户所有,权限0600,这符合Mosquitto的安全要求,无需修改:
chown mosquitto: /etc/mosquitto/certs/server.pem /etc/mosquitto/certs/server.key chmod 0600 /etc/mosquitto/certs/server.pem /etc/mosquitto/certs/server.key
步骤4:重启服务验证
执行以下命令重启Mosquitto服务:
systemctl restart mosquitto systemctl status mosquitto
内容的提问来源于stack exchange,提问作者Jetno

