Elasticsearch无法读取Certbot证书问题及Elasticsearch与Kibana证书共用咨询
问题分析与解决方案
一、错误原因分析
出现java.security.AccessControlException: access denied ("java.io.FilePermission" "/etc/letsencrypt/live/<domain>/fullchain.pem" "read")错误,主要有以下几个核心原因:
- 符号链接指向的实际文件权限不足:/etc/letsencrypt/live/目录下的证书都是软链接,实际文件存储在../archive/
/目录中。你递归设置权限时,可能只修改了live目录及链接本身的权限,而archive目录下的真实证书文件未被赋予elk组读取权限,导致elasticsearch用户无法访问实际内容。 - SELinux限制:如果系统开启了SELinux,即便文件权限配置正确,SELinux的默认上下文规则也可能阻止elasticsearch进程读取/etc/letsencrypt路径下的文件。
- Java安全策略限制(旧版ES):部分旧版本Elasticsearch启用了Java安全管理器,默认策略未允许进程读取/etc/letsencrypt路径下的文件。
二、Elasticsearch与Kibana共用同一证书的方案
方案1:直接共享Certbot生成的证书(推荐)
无需复制证书,直接使用Certbot生成的原文件,只需确保权限配置正确:
- 确认elasticsearch和kibana用户都已加入elk用户组:
usermod -aG elk elasticsearch usermod -aG elk kibana - 递归设置证书核心目录的组权限,确保elk组有读取访问权(750比770更安全,避免不必要的写权限):
chown -R :elk /etc/letsencrypt/archive /etc/letsencrypt/live chmod -R 750 /etc/letsencrypt/archive /etc/letsencrypt/live - 在Elasticsearch配置文件(
/etc/elasticsearch/elasticsearch.yml)中配置证书:xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.certificate_authorities: ["/etc/letsencrypt/live/<domain>/fullchain.pem"] xpack.security.transport.ssl.certificate: "/etc/letsencrypt/live/<domain>/cert.pem" xpack.security.transport.ssl.key: "/etc/letsencrypt/live/<domain>/privkey.pem" xpack.security.http.ssl.enabled: true xpack.security.http.ssl.certificate_authorities: ["/etc/letsencrypt/live/<domain>/fullchain.pem"] xpack.security.http.ssl.certificate: "/etc/letsencrypt/live/<domain>/cert.pem" xpack.security.http.ssl.key: "/etc/letsencrypt/live/<domain>/privkey.pem" - 在Kibana配置文件(
/etc/kibana/kibana.yml)中配置同一证书:server.ssl.enabled: true server.ssl.certificate: "/etc/letsencrypt/live/<domain>/cert.pem" server.ssl.key: "/etc/letsencrypt/live/<domain>/privkey.pem" server.ssl.certificateAuthorities: ["/etc/letsencrypt/live/<domain>/fullchain.pem"] elasticsearch.ssl.certificateAuthorities: ["/etc/letsencrypt/live/<domain>/fullchain.pem"] - 若开启SELinux,需添加上下文规则允许Elasticsearch读取证书:
semanage fcontext -a -t elasticsearch_var_lib_t "/etc/letsencrypt(/.*)?" restorecon -Rv /etc/letsencrypt
方案2:创建证书副本到共享目录
如果不想直接修改Certbot默认目录的权限,可将证书复制到ELK专属目录:
- 创建共享证书目录:
mkdir -p /opt/elk/certs chown :elk /opt/elk/certs chmod 750 /opt/elk/certs - 复制证书并设置权限:
cp /etc/letsencrypt/live/<domain>/*.pem /opt/elk/certs/ chown :elk /opt/elk/certs/*.pem chmod 640 /opt/elk/certs/*.pem - 添加定时任务,在Certbot续期后自动同步证书(避免证书过期失效):
echo '@daily root cp /etc/letsencrypt/live/<domain>/*.pem /opt/elk/certs/ && chown :elk /opt/elk/certs/*.pem && chmod 640 /opt/elk/certs/*.pem && systemctl restart elasticsearch kibana' >> /etc/crontab - 在Elasticsearch和Kibana的配置文件中指向
/opt/elk/certs/下的证书文件即可。
方案3:利用Certbot钩子脚本自动维护权限
为避免Certbot续期证书后权限失效,可添加续期后钩子脚本:
- 创建钩子脚本:
cat > /etc/letsencrypt/renewal-hooks/post/fix-elk-permissions.sh << EOF #!/bin/bash chown -R :elk /etc/letsencrypt/archive /etc/letsencrypt/live chmod -R 750 /etc/letsencrypt/archive /etc/letsencrypt/live systemctl restart elasticsearch kibana EOF - 赋予脚本执行权限:
chmod +x /etc/letsencrypt/renewal-hooks/post/fix-elk-permissions.sh - 后续Certbot自动续期证书后,会自动修复权限并重启服务,保证证书持续可用。
内容的提问来源于stack exchange,提问作者Vivere
相关产品推荐
相关产品推荐

