elasticsearch8+版本证书相关问题
1. 说明
整个证书系统,是由一个根证书,签发各个节点的证书组成
文件后缀说明
.crt: 证书文件,通常包含公钥。
.key: 私钥文件,通常与证书配对使用。
当前文章只涉及这两种文件
2. 生成根证书
/usr/share/elasticsearch/bin/elasticsearch-certutil ca --silent --pem -out config/certs/ca.zip
ca: 此参数表明要执行的操作是生成证书颁发机构(CA)。证书颁发机构在创建和签署其他证书时发挥着关键作用。
--silent: 使用该参数后,命令会以静默模式运行。这意味着不会有交互式提示出现,所有默认值都会被自动接受。
--pem: 该参数指定生成的证书和密钥将采用 PEM(Privacy-Enhanced Mail)格式。PEM 格式的文件便于与其他系统进行集成。
-out: 此参数指定了输出文件的路径。生成的证书和密钥会被压缩到 config/certs/ca.zip 文件中。
3. 准备instances.yml文件
instances.yml 文件通常与证书生成工具(如 elasticsearch-certutil cert)配合使用,用于定义需要生成证书的节点信息。当你需要为 Elasticsearch 集群中的多个节点生成证书时,可以通过编辑这个文件来指定每个节点的详细信息,而不是通过命令行参数逐个指定。
instances.yml文件内容
instances:
- name: elasticsearch
ip:
- 172.16.18.3
- 10.21.12.2
dns:
- localhost
- elasticsearch
当前instances.yml文件表示,为名称为elasticsearch的节点生成一份证书,elasticsearch节点部署的ip为172.16.18.3或者10.21.12.2,dns为localhost或者elasticsearch
如果es在物理机部署,则在ip字段写物理机ip,
如果es在docker当中部署,可以将物理机ip与容器ip都写,
如果容器ip不固定,只写物理机ip
如果无固定物理机地址,可以利用dns字段,但是其他组件例如kibana、logstash访问es时,要通过定义的dns访问
4. 生成各个节点证书
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --silent --pem -out config/certs/certs.zip --in config/certs/instances.yml --ca-cert config/certs/ca/ca.crt --ca-key config/certs/ca/ca.key
cert: 指定生成节点证书(而非 CA 证书)。
--silent: 以静默模式运行命令,避免交互式提示,自动接受默认值。
--pem: 指定生成 PEM 格式的证书和私钥文件,便于与其他系统集成。
-out: 指定输出文件路径,生成的所有节点证书和私钥将被打包到 certs.zip 中。
--in: 指定输入配置文件,即前面准备的instances.yml
--ca-cert: 指定现有 CA 证书的路径,用于签署新生成的节点证书。当前为第1步当中生成的ca.zip解压出来的.crt文件
--ca-key: 指定现有 CA 私钥的路径,用于对节点证书进行签名。注意:CA 私钥是敏感信息,需妥善保管。当前为第1步当中生成的ca.zip解压出来的.key文件
执行脚本之后,会生成certs.zip文件,解压后得到elasticsearch.crt与elasticsearch.key
5. 使用
elasticsearch节点当中使用
# http端口的配置
xpack.security.http.ssl:
enabled: true
verification_mode: certificate
key: certs/elasticsearch/elasticsearch.key # 节点的私钥文件
certificate: certs/elasticsearch/elasticsearch.crt # 节点的证书文件
certificate_authorities: certs/ca/ca.crt # 根证书
# transport端口的配置
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
key: certs/elasticsearch/elasticsearch.key # 节点的私钥文件
certificate: certs/elasticsearch/elasticsearch.crt # 节点的证书文件
certificate_authorities: certs/ca/ca.crt # 根证书
kibana连接elasticsearch时使用
elasticsearch.hosts: [ "https://elasticsearch:9200" ] # 这里的elasticsearch地址,可以使用ip也可以使用域名,前提是要与生成证书时的instances.yml一致
elasticsearch.ssl.certificateAuthorities: ["/usr/share/kibana/certs/ca/ca.crt"] # 根证书
logstash连接elasticsearch时使用
output {
elasticsearch {
# 这里的elasticsearch地址,可以使用ip也可以使用域名,前提是要与生成证书时的instances.yml一致
hosts => ["https://elasticsearch:9200"]
user => "elastic"
password => "xxxxxx"
index => "xxxxxx"
codec => "json"
# ssl设置
ssl_enabled => "true"
ssl_certificate_authorities => "/usr/share/logstash/certs/ca/ca.crt" # 根证书
}
}