使用相同 CA 更新证书
编辑使用相同 CA 更新证书
编辑此过程假设您可以访问最初生成(或由您的组织持有)并用于签署当前使用的节点证书的 CA 证书和密钥。它还假设在 HTTP 层连接到 Elasticsearch 的客户端配置为信任 CA 证书。
如果您可以访问用于签署现有证书的 CA,则只需替换集群中每个节点的证书和密钥。如果您替换每个节点上的现有证书和密钥并使用相同的文件名,Elasticsearch 会重新加载这些文件并开始使用新的证书和密钥。
您无需重启每个节点,但这样做会强制建立新的 TLS 连接,并且在更新证书时是建议的做法。因此,以下步骤包括在更新每个证书后重启节点。
以下步骤提供了为传输层和 HTTP 层生成新节点证书和密钥的说明。您可能只需要更换其中一层的证书,具体取决于您的哪些证书即将过期。
如果您的密钥库受密码保护,密码存储在 Elasticsearch 安全设置中,并且密码需要更改,那么您必须对集群执行滚动重启。您还必须为密钥库使用不同的文件名,以便 Elasticsearch 不会在节点重启之前重新加载该文件。
如果您的 CA 已更改,请完成使用不同的 CA 更新安全证书中的步骤。
为传输层生成新证书
编辑以下示例使用 PKCS#12 文件,但相同的步骤适用于 JKS 密钥库。
-
打开
ES_PATH_CONF/elasticsearch.yml
文件,并检查当前正在使用的密钥库的名称和位置。您将对新证书使用相同的名称。在此示例中,密钥库和信任库指向不同的文件。您的配置可能使用包含证书和 CA 的同一文件。在这种情况下,请同时包含密钥库和信任库的文件路径。
这些说明假设提供的证书由受信任的 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 cert --ca elastic-stack-ca.p12
命令参数
-
--ca <ca_file>
- 用于签署证书的 CA 密钥库的名称。如果您使用
elasticsearch-certutil
工具生成现有 CA,则密钥库名称默认为elastic-stack-ca.p12
。
- 输入输出文件的名称,或接受默认值
elastic-certificates.p12
。 - 出现提示时,输入节点密钥库的密码。
-
-
如果您在创建节点密钥库时输入的密码与当前密钥库密码不同,请运行以下命令将密码存储在 Elasticsearch 密钥库中
./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
-
在您正在更新密钥库的集群中的当前节点上,启动滚动重启。
在指示执行任何需要的更改的步骤处停止,然后继续执行此过程中的下一步。
-
将您现有的密钥库替换为新的密钥库,确保文件名匹配。例如,
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 是否已加载新的密钥库。
resp = client.ssl.certificates() print(resp)
const response = await client.ssl.certificates(); console.log(response);
GET /_ssl/certificates
-
如果您仅更新传输层的证书(而不是 HTTP 层),则一次完成一个节点的步骤 4到步骤 8,直到您更新了集群中的所有密钥库。然后,您可以完成滚动重启的其余步骤。
否则,请勿完成滚动重启。相反,请继续执行为 HTTP 层生成新证书的步骤。
下一步是什么?
编辑做得好!您已更新传输层的密钥库。您也可以在必要时更新 HTTP 层的密钥库。如果您不更新 HTTP 层的密钥库,则一切都已设置完毕。
为 HTTP 层生成新证书
编辑诸如 Kibana 或任何 Elastic 语言客户端之类的其他组件在连接到 Elasticsearch 时会验证此证书。
如果您的组织拥有自己的 CA,则您需要生成证书签名请求 (CSR)。CSR 包含您的 CA 用于生成和签署证书的信息。
-
在安装了 Elasticsearch 的集群中的任何节点上,运行 Elasticsearch HTTP 证书工具。
./bin/elasticsearch-certutil http
此命令生成一个
.zip
文件,其中包含用于 Elasticsearch 和 Kibana 的证书和密钥。每个文件夹都包含一个README.txt
,说明如何使用这些文件。- 当询问您是否要生成 CSR 时,输入
n
。 - 当询问您是否要使用现有 CA 时,输入
y
。 - 输入您的 CA 的绝对路径,例如
elastic-stack-ca.p12
文件的路径。 - 输入您的 CA 的密码。
- 输入证书的过期值。您可以输入以年、月或天为单位的有效期。例如,输入
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 节点 API 来确认节点已加入集群
resp = client.cat.nodes() print(resp)
response = client.cat.nodes puts response
const response = await client.cat.nodes(); console.log(response);
GET _cat/nodes
-
(可选)使用 SSL 证书 API 来验证 Elasticsearch 是否已加载新的密钥库。
resp = client.ssl.certificates() print(resp)
const response = await client.ssl.certificates(); console.log(response);
GET /_ssl/certificates
- 一次一个节点,完成步骤 5到步骤 10,直到您更新了集群中的所有密钥库。
- 完成滚动重启的其余步骤,从重新启用分片分配的步骤开始。