You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 12:51:01