Debian 8下MariaDB无法使用Let's Encrypt SSL证书的问题求助
我之前在Debian 8上部署MariaDB时也碰到过一模一样的问题——Let's Encrypt的证书目录权限看起来能支持Apache,但MariaDB就是死活读不到。核心问题其实出在权限链的完整性和可能的AppArmor限制上,咱们一步步来排查修复:
1. 先理清Let's Encrypt的目录权限链
Let's Encrypt的live目录里的证书都是软链接到archive目录的,所以光给live加ACL没用,必须确保从/etc/letsencrypt开始到archive里的实际证书文件,整个路径mysql用户都有遍历(execute)和读取(read)权限。
先检查默认权限:
ls -ld /etc/letsencrypt应该是drwxr-xr-x root root,这个一般没问题,其他用户能遍历ls -ld /etc/letsencrypt/archive默认是drwx------ root root,这就是最大的坑!mysql用户根本进不去这个目录
2. 给整个权限链设置正确的ACL
执行以下命令,给mysql用户开放必要的权限:
# 让mysql能进入letsencrypt根目录 setfacl -m u:mysql:rx /etc/letsencrypt # 递归给archive目录及文件加读和遍历权限 setfacl -R -m u:mysql:rx /etc/letsencrypt/archive # 同样处理live目录(包括软链接) setfacl -R -m u:mysql:rx /etc/letsencrypt/live
3. 验证mysql用户是否能访问证书
切换到mysql用户测试读取:
su -s /bin/bash mysql cat /etc/letsencrypt/live/your-domain/fullchain.pem
如果能正常输出证书内容,说明权限问题已经解决;如果还是报错,再检查有没有漏掉父目录的权限(比如/etc的权限是不是drwxr-xr-x)。
4. 检查MariaDB的SSL配置是否正确
打开/etc/mysql/my.cnf(或者Debian 8中MariaDB常用的/etc/mysql/mariadb.conf.d/50-server.cnf),找到[mysqld]段,确保配置了正确的证书路径:
ssl_cert = /etc/letsencrypt/live/your-domain/fullchain.pem ssl_key = /etc/letsencrypt/live/your-domain/privkey.pem ssl_ca = /etc/letsencrypt/live/your-domain/chain.pem
注意:必须用绝对路径,不要用相对路径,而且要注释掉旧的自签证书配置,避免冲突。
5. 排查AppArmor限制(关键!)
Debian 8默认启用了AppArmor,它会限制MariaDB的文件访问范围,即使文件权限正确,AppArmor不让访问也白搭。
- 先查看AppArmor状态,确认mysql的profile是enforced:
apparmor_status
如果看到/usr/sbin/mysqld处于enforce模式,就需要修改配置:
- 编辑
/etc/apparmor.d/usr.sbin.mysqld,在/etc/mysql/** r,这一行下面添加:
/etc/letsencrypt/** r,
- 重新加载AppArmor并重启MariaDB:
systemctl reload apparmor systemctl restart mysql
6. 验证MariaDB是否成功启用SSL
登录MariaDB控制台,执行以下命令检查:
SHOW VARIABLES LIKE '%ssl%';
如果Ssl_cipher字段不是空值,说明SSL已经成功启用了;如果还是空的,查看MariaDB日志/var/log/mysql/error.log,里面会有具体的错误信息(比如证书路径错了、权限还是不够等)。
内容的提问来源于stack exchange,提问作者Kristi

