TLS 安全配置

TLS 安全配置指南 #

Easysearch 默认启用安全功能,包括 TLS 加密。本文介绍如何配置和管理 TLS 证书,以保障集群通信安全。

TLS 的两层保护 #

层级配置项保护范围
HTTP 层security.ssl.http.*客户端 ↔ Easysearch REST API
Transport 层security.ssl.transport.*Easysearch 节点 ↔ 节点

生产环境两层都必须启用

使用自签名证书(快速启动) #

bin/initialize.sh -s 会自动生成自签名证书,适合测试和快速验证:

bin/initialize.sh -s
# 生成的证书位于 config/ 目录

使用企业 CA 证书(生产推荐) #

1. 准备证书文件 #

需要以下文件:

文件说明
ca.crtCA 根证书
node.crt节点证书
node.key节点私钥
admin.crtAdmin 客户端证书
admin.keyAdmin 客户端私钥

2. 配置 easysearch.yml #

# ========== 启用安全模块 ==========
security.enabled: true
security.audit.type: noop

# ========== Transport 层 TLS ==========
security.ssl.transport.cert_file: node.crt
security.ssl.transport.key_file: node.key
security.ssl.transport.ca_file: ca.crt
security.ssl.transport.skip_domain_verify: true

# ========== HTTP 层 TLS ==========
security.ssl.http.enabled: true
security.ssl.http.cert_file: node.crt
security.ssl.http.key_file: node.key
security.ssl.http.ca_file: ca.crt
security.ssl.http.clientauth_mode: OPTIONAL

# ========== Admin 证书 DN ==========
security.authcz.admin_dn:
  - "CN=admin,OU=DevOps,O=MyCompany,L=Shanghai,ST=Shanghai,C=CN"

security.nodes_dn:
  - "CN=node-*,OU=Infra,O=MyCompany,L=Shanghai,ST=Shanghai,C=CN"

# ========== 其他安全配置 ==========
security.allow_default_init_securityindex: true
security.restapi.roles_enabled: ["superuser", "security_rest_api_access"]
security.system_indices.enabled: true
security.system_indices.indices: [".infini-*"]

3. 使用 OpenSSL 生成证书 #

# 生成 CA
openssl genrsa -out root-ca-key.pem 2048
openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem -days 3650 \
  -subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/OU=Infra/CN=RootCA"

# 生成节点证书
openssl genrsa -out node-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in node-key-temp.pem -topk8 -nocrypt -out node-key.pem
openssl req -new -key node-key.pem -out node.csr \
  -subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/OU=Infra/CN=node-1"
openssl x509 -req -in node.csr -CA root-ca.pem -CAkey root-ca-key.pem \
  -CAcreateserial -out node.pem -days 730 -sha256

# 生成 admin 证书
openssl genrsa -out admin-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -out admin-key.pem
openssl req -new -key admin-key.pem -out admin.csr \
  -subj "/C=CN/ST=Shanghai/L=Shanghai/O=MyCompany/OU=DevOps/CN=admin"
openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem \
  -CAcreateserial -out admin.pem -days 730 -sha256

TLS 版本与密码套件 #

限制 TLS 版本 #

# 仅允许 TLS 1.2 和 1.3(禁用 1.0/1.1)
security.ssl.http.enabled_protocols:
  - "TLSv1.2"
  - "TLSv1.3"

security.ssl.transport.enabled_protocols:
  - "TLSv1.2"
  - "TLSv1.3"

限制密码套件 #

security.ssl.http.enabled_ciphers:
  - "TLS_AES_128_GCM_SHA256"
  - "TLS_AES_256_GCM_SHA384"
  - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
  - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
  - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
  - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"

security.ssl.transport.enabled_ciphers:
  - "TLS_AES_128_GCM_SHA256"
  - "TLS_AES_256_GCM_SHA384"
  - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
  - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
  - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"
  - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"

证书验证 #

# 验证证书内容
openssl x509 -in node.pem -text -noout

# 验证证书链
openssl verify -CAfile root-ca.pem node.pem

# 测试 HTTPS 连接
curl -v --cacert root-ca.pem https://localhost:9200

证书续期 #

证书到期前需要续期,步骤:

  1. 使用同一 CA 签发新证书
  2. 替换各节点的 node.crtnode.key
  3. 逐节点滚动重启(先重启非 master 节点)

建议在监控中设置证书过期告警(提前 30 天)。

常见问题 #

问题原因解决方案
SSLHandshakeException证书不受信任检查 ca_file 是否包含正确的 CA
节点无法加入集群Transport 证书 DN 不匹配检查 nodes_dn 配置
curl 报证书错误客户端不信任 CA使用 -k 跳过或 --cacert 指定 CA

延伸阅读 #