Let's Encrypt证书权限问题导致PostgreSQL无法使用SSL的解决方案咨询
Let's Encrypt证书权限问题导致PostgreSQL无法使用SSL的解决方案咨询
嗨,我来帮你搞定这个不用反复复制证书的权限问题!你遇到的情况很常见——Certbot默认生成的证书和目录都是root:root权限,而PostgreSQL是用postgres用户运行的,自然读不到这些文件。下面给你靠谱的解决办法,重点推荐第一个,一劳永逸:
推荐方案:用ACL+Certbot钩子自动维护权限
这个方法不用改动证书的属主属组,而是通过访问控制列表(ACL)给postgres用户单独开读取权限,并且配置Certbot的钩子脚本,让证书更新后自动同步权限,完全不用手动干预。
1. 先给现有证书目录设置ACL
执行下面的命令,让postgres能读取Certbot的证书存储目录(包括live和archive,因为live里的文件其实是指向archive的软链接):
sudo setfacl -R -m u:postgres:rX /etc/letsencrypt/live/ sudo setfacl -R -m u:postgres:rX /etc/letsencrypt/archive/
解释:
rX的意思是对目录赋予读取+执行权限(这样才能进入目录),对文件赋予读取权限,刚好满足PostgreSQL读取证书的需求,又不会给多余权限。
2. 配置Certbot更新钩子,确保证书续期后权限自动生效
因为Certbot续期证书时会覆盖旧文件,ACL不会自动继承,所以需要加个钩子脚本:
- 创建钩子脚本文件:
sudo nano /etc/letsencrypt/renewal-hooks/post/update-postgres-acl.sh
- 写入以下内容:
#!/bin/bash # 给postgres用户更新证书目录的ACL权限 setfacl -R -m u:postgres:rX /etc/letsencrypt/live/ setfacl -R -m u:postgres:rX /etc/letsencrypt/archive/
- 给脚本加执行权限:
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/update-postgres-acl.sh
这样以后每次Certbot自动或者手动续期证书,都会自动运行这个脚本,把权限同步给postgres,再也不用手动处理了。
3. 最后重启PostgreSQL生效
sudo systemctl restart postgresql
之后就可以测试PostgreSQL的SSL连接是否正常了。
不推荐的方案:直接修改证书属组
你可能会想直接把证书的属组改成postgres,但这么做有个问题——Certbot每次续期都会生成新的证书文件,默认还是root:root权限,你得每次手动改,太麻烦了,所以不推荐。
备注:内容来源于stack exchange,提问作者ciro
相关产品推荐
相关产品推荐

