使用不同的 CA 更新安全证书
编辑使用不同的 CA 更新安全证书编辑
如果您必须信任来自组织的新 CA,或者您需要自己生成新的 CA,请使用此新 CA 对新的节点证书进行签名,并指示您的节点信任新的 CA。
为传输层生成新证书编辑
创建一个新的 CA 证书,或者获取您组织的 CA 证书,并将其添加到您现有的 CA 信任库中。完成所有节点的证书更新后,您可以从信任库中删除旧的 CA 证书(但不要在此之前删除!)。
以下示例使用 PKCS#12 文件,但相同的步骤也适用于 JKS 密钥库。
-
打开
ES_PATH_CONF/elasticsearch.yml
文件,并检查当前使用的密钥库的名称和位置。您将对新的密钥库使用相同的名称。在此示例中,密钥库和信任库使用不同的文件。您的配置可能对密钥库和信任库使用相同的文件。
这些说明假设提供的证书由受信任的 CA 签名,并且验证模式设置为
certificate
。此设置可确保节点不会尝试执行主机名验证。xpack.security.transport.ssl.keystore.path: config/elastic-certificates.p12 xpack.security.transport.ssl.keystore.type: PKCS12 xpack.security.transport.ssl.truststore.path: config/elastic-stack-ca.p12 xpack.security.transport.ssl.truststore.type: PKCS12 xpack.security.transport.ssl.verification_mode: certificate
-
在集群中的任何节点上,生成一个新的 CA 证书。您只需完成一次此步骤。如果您使用的是组织的 CA 证书,则跳过此步骤。
./bin/elasticsearch-certutil ca --pem
命令参数
-
--pem
- 生成一个目录,其中包含 PEM 格式的 CA 证书和密钥,而不是 PKCS#12。
- 输入包含证书和密钥的压缩输出文件的名称,或者接受默认名称
elastic-stack-ca.zip
。 -
解压缩输出文件。生成的目录包含一个 CA 证书 (
ca.crt
) 和一个私钥 (ca.key
)。将这些文件保存在安全的位置,因为它们包含您的 CA 的私钥。
-
-
在集群中的每个节点上,将新的
ca.crt
证书导入到您现有的 CA 信任库中。此步骤可确保您的集群信任新的 CA 证书。此示例使用 Javakeytool
实用程序将证书导入到elastic-stack-ca.p12
CA 信任库中。keytool -importcert -trustcacerts -noprompt -keystore elastic-stack-ca.p12 \ -storepass <password> -alias new-ca -file ca.crt
命令参数
-
-keystore
- 要将新的 CA 证书导入到的信任库的名称。
-
-storepass
- CA 信任库的密码。
-
-alias
- 要分配给密钥库中新的 CA 证书条目的名称。
-
-file
- 要导入的新的 CA 证书的名称。
-
-
keytool -keystore config/elastic-stack-ca.p12 -list
出现提示时,请输入 CA 信任库的密码。
输出应包含现有的 CA 证书和您的新证书。如果您之前使用
elasticsearch-certutil
工具生成密钥库,则旧 CA 的别名默认为ca
,条目类型为PrivateKeyEntry
。
为集群中的每个节点生成一个新证书编辑
现在您的 CA 信任库已更新,请使用您的新 CA 证书为您的节点签名证书。
如果您的组织有自己的 CA,则需要生成证书签名请求 (CSR)。CSR 包含您的 CA 用于生成和签署安全证书的信息。
-
使用新的 CA 证书和密钥,为您的节点创建一个新证书。
./bin/elasticsearch-certutil cert --ca-cert ca/ca.crt --ca-key ca/ca.key
命令参数
-
--ca-cert
- 指定 PEM 格式的新 CA 证书 (
ca.crt
) 的路径。您还必须指定--ca-key
参数。 -
--ca-key
- 指定 CA 证书的私钥 (
ca.key
) 的路径。您还必须指定--ca-cert
参数。
- 输入输出文件的名称,或者接受默认名称
elastic-certificates.p12
。 - 出现提示时,请输入您的节点证书的密码。
-
-
在您要更新密钥库的集群的当前节点上,启动滚动重启。
在指示执行任何必要的更改的步骤处停止,然后继续执行此过程的下一步。
-
将您现有的密钥库替换为新的密钥库,确保文件名匹配。例如,
elastic-certificates.p12
。如果您的密钥库密码正在更改,则使用新的文件名保存密钥库,以便 Elasticsearch 在您更新密码之前不会尝试重新加载该文件。
-
如果您需要使用新的文件名保存新的密钥库,请更新
ES_PATH_CONF/elasticsearch.yml
文件以使用新的密钥库的文件名。例如xpack.security.transport.ssl.keystore.path: config/elastic-certificates.p12 xpack.security.transport.ssl.keystore.type: PKCS12 xpack.security.transport.ssl.truststore.path: config/elastic-stack-ca.p12 xpack.security.transport.ssl.truststore.type: PKCS12
- 启动您更新了密钥库的节点。
-
(可选)使用SSL 证书 API 验证 Elasticsearch 是否加载了新的密钥库。
GET /_ssl/certificates
-
如果您只更新传输层(而不是 HTTP 层)的证书,则一次在一个节点上完成从步骤 2 到步骤 6 的操作,直到您更新了集群中的所有密钥库。然后,您可以完成滚动重启的剩余步骤。
否则,请勿完成滚动重启。而是继续执行为 HTTP 层生成新证书的步骤。
-
(可选)在替换了集群中每个节点上的密钥库后,列出您的信任库中的证书,然后删除旧的 CA 证书。
如果您之前使用
elasticsearch-certutil
工具生成密钥库,则旧 CA 的别名默认为ca
,条目类型为PrivateKeyEntry
。keytool -delete -noprompt -alias ca -keystore config/elastic-stack-ca.p12 \ -storepass <password>
命令参数
-
-alias
- 要从信任库中删除的旧 CA 证书的密钥库别名名称。
-
下一步是什么?编辑
干得好!您已经更新了传输层的密钥库。如果需要,您还可以更新 HTTP 层的密钥库。如果您不更新 HTTP 层的密钥库,那么您就完成了。
为 HTTP 层生成新证书编辑
您可以使用新的 CA 证书和私钥为 HTTP 层生成证书。其他组件(例如 Kibana 或任何 Elastic 语言客户端)在连接到 Elasticsearch 时都会验证此证书。
如果您的组织有自己的 CA,则需要生成证书签名请求 (CSR)。CSR 包含您的 CA 用于生成和签署安全证书的信息,而不是使用 elasticsearch-certutil
工具生成的 self-signed 证书。
-
在安装了 Elasticsearch 的集群中的任何节点上,运行 Elasticsearch HTTP 证书工具。
./bin/elasticsearch-certutil http
此命令生成一个
.zip
文件,其中包含用于 Elasticsearch 和 Kibana 的证书和密钥。每个文件夹都包含一个README.txt
,解释如何使用这些文件。- 当询问您是否要生成 CSR 时,请输入
n
。 - 当询问您是否要使用现有的 CA 时,请输入
y
。 - 输入您的新 CA 证书的绝对路径,例如
ca.crt
文件的路径。 - 输入您的新 CA 证书私钥的绝对路径,例如
ca.key
文件的路径。 - 输入证书的到期值。您可以输入以年、月或日为单位的有效期。例如,输入
1y
表示一年。 -
当询问您是否要为每个节点生成一个证书时,请输入
y
。每个证书都将拥有自己的私钥,并且将针对特定的主机名或 IP 地址颁发。
- 出现提示时,请输入集群中第一个节点的名称。使用与
elasticsearch.yml
文件中node.name
参数的值相同的节点名称。 -
输入用于连接到第一个节点的所有主机名。这些主机名将作为 DNS 名称添加到证书的使用者可选名称 (SAN) 字段中。
列出用于通过 HTTPS 连接到集群的每个主机名和变体。
- 输入客户端可以用来连接到节点的 IP 地址。
- 对集群中的每个其他节点重复这些步骤。
- 当询问您是否要生成 CSR 时,请输入
- 为每个节点生成证书后,在出现提示时输入密钥库的密码。
-
解压缩生成的
elasticsearch-ssl-http.zip
文件。此压缩文件包含 Elasticsearch 和 Kibana 的一个目录。在/elasticsearch
目录中,有一个目录对应您指定的每个节点,其中包含其自己的http.p12
文件。例如/node1 |_ README.txt |_ http.p12 |_ sample-elasticsearch.yml
/node2 |_ README.txt |_ http.p12 |_ sample-elasticsearch.yml
/node3 |_ README.txt |_ http.p12 |_ sample-elasticsearch.yml
- 如有必要,请重命名每个
http.p12
文件,以匹配现有 HTTP 客户端通信证书的名称。例如,node1-http.p12
。 -
在集群中要更新密钥库的当前节点上,启动滚动重启。
在指示执行任何必要的更改的步骤处停止,然后继续执行此过程的下一步。
-
将现有密钥库替换为新密钥库,确保文件名匹配。例如,
node1-http.p12
。如果您的密钥库密码正在更改,则使用新的文件名保存密钥库,以便 Elasticsearch 在您更新密码之前不会尝试重新加载该文件。
-
如果您需要使用新的文件名保存新的密钥库,请更新
ES_PATH_CONF/elasticsearch.yml
文件以使用新的密钥库的文件名。例如xpack.security.http.ssl.enabled: true xpack.security.http.ssl.keystore.path: node1-http.p12
-
如果您的密钥库密码发生更改,请将私钥密码添加到 Elasticsearch 的安全设置中。
./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
-
启动您更新了密钥库的节点。
使用cat nodes API确认节点已加入集群
resp = client.cat.nodes() print(resp)
response = client.cat.nodes puts response
GET _cat/nodes
-
(可选)使用SSL 证书 API验证 Elasticsearch 是否已加载新的密钥库。
GET /_ssl/certificates
- 一次一个节点,完成从步骤 5到步骤 10的操作,直到更新集群中的所有密钥库。
- 完成滚动重启的其余步骤,从重新启用分片分配步骤开始。
下一步是什么?编辑
做得好!您已更新 HTTP 层的密钥库。您现在可以更新 Kibana 和 Elasticsearch 之间的加密。
更新 Kibana 和 Elasticsearch 之间的加密编辑
当您使用 http
选项运行 elasticsearch-certutil
工具时,它会创建一个包含 elasticsearch-ca.pem
文件的 /kibana
目录。您可以使用此文件将 Kibana 配置为信任 HTTP 层的 Elasticsearch CA。
-
将
elasticsearch-ca.pem
文件复制到 Kibana 配置目录,该目录由KBN_PATH_CONF
路径定义。KBN_PATH_CONF
包含 Kibana 配置文件的路径。如果您使用归档发行版(zip
或tar.gz
)安装 Kibana,则该路径默认为KBN_HOME/config
。如果您使用软件包发行版(Debian 或 RPM),则该路径默认为/etc/kibana
。 -
如果您修改了
elasticsearch-ca.pem
文件的文件名,请编辑kibana.yml
并更新配置以指定 HTTP 层的安全证书的位置。elasticsearch.ssl.certificateAuthorities: KBN_PATH_CONF/elasticsearch-ca.pem
- 重启 Kibana。