New

The executive guide to generative AI

Read more

使用不同的 CA 更新安全证书

编辑

如果您必须信任组织中的新 CA,或者您需要自己生成新的 CA,请使用此新 CA 签署新的节点证书,并指示您的节点信任该新 CA。

为传输层生成新的证书

编辑

创建新的 CA 证书,或获取您组织的 CA 证书,并将其添加到您现有的 CA 信任库中。在您完成更新所有节点的证书后,您可以从信任库中删除旧的 CA 证书(但不要在此之前删除!)。

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

  1. 打开 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
  2. 在集群中的任何节点上,生成一个新的 CA 证书。您只需完成此步骤一次。如果您正在使用您组织的 CA 证书,则跳过此步骤。

    ./bin/elasticsearch-certutil ca --pem
    命令参数
    --pem
    生成一个目录,其中包含 PEM 格式的 CA 证书和密钥,而不是 PKCS#12 格式。
    1. 输入将包含您的证书和密钥的压缩输出文件的名称,或接受默认名称 elastic-stack-ca.zip
    2. 解压缩输出文件。生成的目录包含一个 CA 证书 (ca.crt) 和一个私钥 (ca.key)。

      将这些文件保存在安全位置,因为它们包含您的 CA 的私钥。

  3. 在集群中的每个节点上,将新的 ca.crt 证书导入到您现有的 CA 信任库中。此步骤确保您的集群信任新的 CA 证书。此示例使用 Java keytool 实用程序将证书导入到 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 证书的名称。
  4. 检查新的 CA 证书是否已添加到您的信任库中。

    keytool -keystore config/elastic-stack-ca.p12 -list

    出现提示时,输入 CA 信任库的密码。

    输出应同时包含现有的 CA 证书和您的新证书。如果您之前使用 elasticsearch-certutil 工具生成密钥库,则旧 CA 的别名默认为 ca,并且条目的类型为 PrivateKeyEntry

为集群中的每个节点生成新的证书

编辑

现在您的 CA 信任库已更新,请使用新的 CA 证书为您的节点签署证书。

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

  1. 使用新的 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 参数。
    1. 输入输出文件的名称或接受默认名称 elastic-certificates.p12
    2. 出现提示时,输入您的节点证书的密码。
  2. 在您正在更新密钥库的集群中的当前节点上,启动滚动重启

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

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

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

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

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

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

  8. (可选)在替换集群中每个节点上的密钥库后,列出信任库中的证书,然后删除旧的 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 工具生成的自签名证书。

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

    ./bin/elasticsearch-certutil http

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

    1. 当询问您是否要生成 CSR 时,输入 n
    2. 当询问您是否要使用现有的 CA 时,输入 y
    3. 输入您的 CA 证书的绝对路径,例如 ca.crt 文件的路径。
    4. 输入您的新 CA 证书私钥的绝对路径,例如 ca.key 文件的路径。
    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 nodes 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. 完成滚动重启的剩余步骤,从重新启用分片分配的步骤开始。

接下来是什么?

编辑

做得好!您已经更新了 HTTP 层的密钥库。现在您可以更新 Kibana 和 Elasticsearch 之间的加密

更新 Kibana 和 Elasticsearch 之间的加密

编辑

当您使用 http 选项运行 elasticsearch-certutil 工具时,它创建了一个包含 elasticsearch-ca.pem 文件的 /kibana 目录。您可以使用此文件来配置 Kibana,使其信任 HTTP 层的 Elasticsearch CA。

  1. elasticsearch-ca.pem 文件复制到 Kibana 配置目录,该目录由 KBN_PATH_CONF 路径定义。

    KBN_PATH_CONF 包含 Kibana 配置文件的路径。如果您使用归档发行版(ziptar.gz)安装 Kibana,则该路径默认为 KBN_HOME/config。如果您使用软件包发行版(Debian 或 RPM),则该路径默认为 /etc/kibana

  2. 如果您修改了 elasticsearch-ca.pem 文件的文件名,请编辑 kibana.yml 并更新配置,以指定 HTTP 层的安全证书的位置。

    elasticsearch.ssl.certificateAuthorities: KBN_PATH_CONF/elasticsearch-ca.pem
  3. 重启 Kibana。