使用相同 CA 更新证书

编辑

此过程假设您可以访问最初生成的(或以其他方式由您的组织持有)并用于签署当前正在使用的节点证书的 CA 证书和密钥。它还假设连接到 HTTP 层上 Elasticsearch 的客户端已配置为信任 CA 证书。

如果您有权访问用于签署现有证书的 CA,则只需要替换集群中每个节点的证书和密钥。如果您替换每个节点上的现有证书和密钥并使用相同的文件名,Elasticsearch 将重新加载文件并开始使用新的证书和密钥。

您无需重新启动每个节点,但这样做会强制进行新的 TLS 连接,并且在更新证书时是 推荐的做法。因此,以下步骤包括在更新每个证书后重新启动节点。

以下步骤提供了为传输层和 HTTP 层生成新的节点证书和密钥的说明。根据您的哪个证书即将过期,您可能只需要替换其中一层证书。

如果您的密钥库受密码保护,密码存储在 Elasticsearch 安全设置中,*并且*需要更改密码,则必须对集群执行 滚动重启。您还必须为密钥库使用不同的文件名,以便 Elasticsearch 不会在节点重新启动之前重新加载文件。

如果您的 CA 已更改,请完成 使用不同的 CA 更新安全证书 中的步骤。

为传输层生成新证书

编辑

以下示例使用 PKCS#12 文件,但相同的步骤也适用于 JKS 密钥库。

  1. 打开 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
  2. 使用现有的 CA,为您的节点生成密钥库。您必须使用用于签署当前正在使用的证书的 CA。

    ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
    命令参数
    --ca <ca_file>
    用于签署证书的 CA 密钥库的名称。如果您使用 elasticsearch-certutil 工具生成现有的 CA,则密钥库名称默认为 elastic-stack-ca.p12
    1. 输入输出文件的名称,或接受默认的 elastic-certificates.p12
    2. 出现提示时,输入节点密钥库的密码。
  3. 如果您在创建节点密钥库时输入的密码与当前密钥库密码不同,请运行以下命令将密码存储在 Elasticsearch 密钥库中

    ./bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
  4. 在您正在更新密钥库的集群中的当前节点上,启动 滚动重启

    停止在指示 执行任何必要的更改 的步骤处,然后继续执行此过程中的下一步。

  5. 将现有的密钥库替换为新的密钥库,确保文件名匹配。例如,elastic-certificates.p12

    如果您的 密钥库密码正在更改,则使用新的文件名保存密钥库,以便 Elasticsearch 不会在您更新密码之前尝试重新加载文件。

  6. 如果您需要使用新的文件名保存新的密钥库,请更新 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
  7. 启动您更新了密钥库的节点。
  8. (可选) 使用 SSL 证书 API 验证 Elasticsearch 是否加载了新的密钥库。

    resp = client.ssl.certificates()
    print(resp)
    const response = await client.ssl.certificates();
    console.log(response);
    GET /_ssl/certificates
  9. 如果您仅更新传输层的证书(而不是 HTTP 层的证书),则一次更新一个节点,完成从 步骤 4步骤 8,直到更新集群中的所有密钥库。然后,您可以完成 滚动重启 的其余步骤。

    否则,请不要完成滚动重启。而是继续执行为 HTTP 层生成新证书的步骤。

下一步是什么?

编辑

做得好!您已更新传输层的密钥库。您也可以 更新 HTTP 层的密钥库(如有必要)。如果您不更新 HTTP 层的密钥库,那么一切就绪。

为 HTTP 层生成新证书

编辑

Kibana 或任何 Elastic 语言客户端等其他组件在连接到 Elasticsearch 时会验证此证书。

如果您的组织拥有自己的 CA,则需要 生成证书签名请求 (CSR)。CSR 包含 CA 用于生成和签署证书的信息。

  1. 在安装了 Elasticsearch 的集群中的任何节点上,运行 Elasticsearch HTTP 证书工具。

    ./bin/elasticsearch-certutil http

    此命令会生成一个 .zip 文件,其中包含与 Elasticsearch 和 Kibana 一起使用的证书和密钥。每个文件夹都包含一个 README.txt 文件,说明如何使用这些文件。

    1. 当询问您是否要生成 CSR 时,输入 n
    2. 当询问您是否要使用现有的 CA 时,输入 y
    3. 输入 CA 的绝对路径,例如 elastic-stack-ca.p12 文件的路径。
    4. 输入 CA 的密码。
    5. 输入证书的到期值。您可以输入以年、月或日为单位的有效期。例如,输入 1y 表示一年。
    6. 当询问您是否要为每个节点生成一个证书时,输入 y

      每个证书将拥有自己的私钥,并将为特定主机名或 IP 地址颁发。

    7. 出现提示时,输入集群中第一个节点的名称。最好使用与 elasticsearch.yml 文件中 node.name 参数的值相同的节点名称。
    8. 输入用于连接到第一个节点的所有主机名。这些主机名将作为 DNS 名称添加到证书中的主题备用名称 (SAN) 字段中。

      列出通过 HTTPS 连接到集群的每个主机名和变体。

    9. 输入客户端可用于连接到节点的 IP 地址。
    10. 对集群中的每个附加节点重复这些步骤。
  2. 为每个节点生成证书后,出现提示时输入私钥的密码。
  3. 解压缩生成的 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
  4. 如有必要,请重命名 http.p12 文件以匹配您现有的 HTTP 客户端通信证书的名称。例如,node1-http.p12
  5. 在您正在更新密钥库的集群中的当前节点上,启动 滚动重启

    停止在指示 执行任何必要的更改 的步骤处,然后继续执行此过程中的下一步。

  6. 将现有的密钥库替换为新的密钥库,确保文件名匹配。例如,node1-http.p12

    如果您的 密钥库密码正在更改,则使用新的文件名保存密钥库,以便 Elasticsearch 不会在您更新密码之前尝试重新加载文件。

  7. 如果您需要使用新的文件名保存新的密钥库,请更新 ES_PATH_CONF/elasticsearch.yml 文件以使用新密钥库的文件名。例如

    xpack.security.http.ssl.enabled: true
    xpack.security.http.ssl.keystore.path: node1-http.p12
  8. 如果您的密钥库密码正在更改,请将私钥的密码添加到 Elasticsearch 中的安全设置。

    ./bin/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
  9. 启动您更新了密钥库的节点。

    使用 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
  10. (可选) 使用 SSL 证书 API 验证 Elasticsearch 是否加载了新的密钥库。

    resp = client.ssl.certificates()
    print(resp)
    const response = await client.ssl.certificates();
    console.log(response);
    GET /_ssl/certificates
  11. 一次一个节点地完成从 步骤 5步骤 10,直到更新集群中的所有密钥库。
  12. 完成 滚动重启 的其余步骤,从 重新启用分片分配 的步骤开始。