使用不同的 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。