更新节点安全证书
edit更新节点安全证书
edit如果您的当前节点证书即将过期,您正在向安全集群添加新节点,或者安全漏洞破坏了您的证书链的信任,您可能需要更新您的TLS证书。使用SSL证书 API检查您的证书何时过期。
在您可以访问用于签署现有节点证书的原始证书颁发机构(CA)密钥和证书(并且您仍然可以信任您的CA)的情况下,您可以使用该CA签署新的证书。
如果您需要信任来自您组织的新CA,或者您需要自己生成一个新的CA,您需要使用这个新的CA来签署新的节点证书,并指示您的节点信任新的CA。在这种情况下,您将使用您的新CA签署节点证书,并指示您的节点信任此证书链。
根据哪些证书即将到期,您可能需要更新传输层的证书、HTTP层的证书或两者都需要更新。
无论在何种情况下,Elasticsearch 默认会每隔五秒监控 SSL 资源的更新。您只需将新的证书和密钥文件(或密钥库)复制到 Elasticsearch 配置目录中,您的节点将会检测到这些更改并重新加载密钥和证书。
因为 Elasticsearch 不会重新加载 elasticsearch.yml 配置文件,
如果你想利用自动证书和密钥重新加载功能,你必须使用 相同的文件名。
如果您需要更新 elasticsearch.yml 配置或更改存储在 安全设置 中的密钥或密钥库的密码,则必须完成一次 滚动重启。Elasticsearch 不会自动重新加载存储在安全设置中的密码更改。
使用相同的CA更新证书
edit此过程假设您可以访问最初生成(或由您的组织持有)并用于签署当前使用的节点证书的CA证书和密钥。还假设连接到HTTP层上的Elasticsearch的客户端已配置为信任该CA证书。
如果您有权访问用于签署现有证书的CA,您只需要替换集群中每个节点的证书和密钥。如果您在每个节点上替换现有的证书和密钥并使用相同的文件名,Elasticsearch将重新加载这些文件并开始使用新的证书和密钥。
您不必重新启动每个节点,但这样做会强制建立新的 TLS 连接,并且在更新证书时,推荐的做法。因此,以下步骤包括在更新每个证书后重新启动节点。
以下步骤提供了为传输层和HTTP层生成新节点证书和密钥的说明。您可能只需要替换其中一个层的证书,具体取决于哪些证书即将过期。
如果您的密钥库是受密码保护的,密码存储在Elasticsearch的安全设置中,并且需要更改密码,那么您必须在集群上执行滚动重启。您还必须为密钥库使用不同的文件名,以便在节点重启之前Elasticsearch不会重新加载该文件。
如果您的CA已更改,请完成使用不同的CA更新安全证书中的步骤。
为传输层生成新证书
edit以下示例使用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密钥库的名称。
如果您使用
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是否加载了新的密钥库。
GET /_ssl/certificates
-
如果您仅更新传输层的证书(而不是HTTP层),则一次一个节点完成步骤4到步骤8,直到您更新了集群中所有密钥库。然后,您可以完成剩余的步骤以进行滚动重启。
否则,不要完成滚动重启。相反,继续执行为HTTP层生成新证书的步骤。
下一步是什么?
edit干得好!您已经更新了传输层的密钥库。如果需要,您还可以更新HTTP层的密钥库。如果您不更新HTTP层的密钥库,那么您已经全部设置好了。
为HTTP层生成新证书
edit其他组件,如Kibana或任何Elastic语言客户端,在连接到Elasticsearch时会验证此证书。
如果您的组织有自己的CA,您需要 生成证书签名请求(CSRs)。CSRs包含 您的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名称添加到您的证书的Subject Alternative Name (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 确认节点已加入集群:
GET _cat/nodes
-
(可选) 使用 SSL证书API 来验证Elasticsearch是否加载了新的密钥库。
GET /_ssl/certificates
- 一次一个节点,完成 步骤5 到 步骤10,直到您更新了集群中所有节点的密钥库。
- 完成剩余的步骤以进行 滚动重启, 从 重新启用分片分配 的步骤开始。
使用不同的CA更新安全证书
edit如果您需要信任来自您组织的新CA,或者您需要自己生成一个新的CA,请使用这个新CA来签署新的节点证书,并指示您的节点信任这个新CA。
为传输层生成新证书
edit创建一个新的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 - 生成一个包含CA证书和密钥的目录,格式为PEM,而不是PKCS#12。
-
输入一个压缩输出文件的名称,该文件将包含您的证书和密钥,或接受默认名称
elastic-stack-ca.zip。 -
解压缩输出文件。生成的目录包含一个CA证书(
ca.crt)和一个私钥(ca.key)。将这些文件保存在安全的位置,因为它们包含您的CA的私钥。
-
-
在集群中的每个节点上,将新的
ca.crt证书导入到现有的CA信任库中。此步骤确保您的集群信任新的CA证书。此示例使用Javakeytool实用程序将证书导入到elastic-stack-ca.p12CA信任库中。keytool -importcert -trustcacerts -noprompt -keystore elastic-stack-ca.p12 \ -storepass
-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。
为集群中的每个节点生成一个新的证书
edit现在您的CA信任库已更新,请使用新的CA证书为您的节点签署证书。
如果您的组织有自己的CA,您需要 生成证书签名请求(CSRs)。CSRs包含 您的CA用于生成和签署安全证书的信息。
-
使用新的CA证书和密钥,为您的节点创建一个新的证书。
./bin/elasticsearch-certutil cert --ca-cert ca/ca.crt --ca-key ca/ca.key
命令参数
-
--ca-cert -
指定您的新的CA证书(
ca.crt)的路径,格式为PEM。您还必须指定--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
命令参数
-
-alias - 您希望从信任库中删除的旧CA证书的密钥库别名的名称。
-
下一步是什么?
edit干得好!您已经更新了传输层的密钥库。如果需要,您还可以更新HTTP层的密钥库。如果您不更新HTTP层的密钥库,那么您已经全部设置好了。
为HTTP层生成新证书
edit您可以使用新的CA证书和私钥为HTTP层生成证书。其他组件,如Kibana或任何Elastic语言客户端,在连接到Elasticsearch时会验证此证书。
如果您的组织有自己的CA,您需要
生成证书签名请求(CSRs)。CSRs包含
您的CA用于生成和签署安全证书的信息,而不是使用elasticsearch-certutil工具
生成的自签名证书。
-
在安装了 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名称添加到您的证书的Subject Alternative Name (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 确认节点已加入集群:
GET _cat/nodes
-
(可选) 使用 SSL证书API 来验证Elasticsearch是否加载了新的密钥库。
GET /_ssl/certificates
- 一次一个节点,完成 步骤5 到 步骤10,直到您更新了集群中所有节点的密钥库。
- 完成剩余的步骤以进行 滚动重启, 从 重新启用分片分配 的步骤开始。
下一步是什么?
edit干得好!您已经更新了HTTP层的密钥库。现在您可以 更新Kibana和Elasticsearch之间的加密。
更新 Kibana 和 Elasticsearch 之间的加密
edit当你使用http选项运行elasticsearch-certutil工具时,它创建了一个包含elasticsearch-ca.pem文件的/kibana目录。你使用此文件来配置Kibana以信任Elasticsearch CA用于HTTP层。
-
将
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。