Elasticsearch:如何在不更新证书的情况下为集群之间建立互信

Posted Elastic 中国社区官方博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch:如何在不更新证书的情况下为集群之间建立互信相关的知识,希望对你有一定的参考价值。

我们知道,建立集群之间的互信非常重要。这个是为我们进行 CCR 及 CCS 操作的基础。只有建立好了集群之间的互信,我们才可以创建集群之间的 remote connection。特别是针对含有 SSL 连接的集群,他们含有各自的证书,那么我们该如何建立集群之间的互信呢?在我之前的文章 “Elasticsearch:如何为 CCR 及 CCS 建立带有安全的集群之间的互信” 中,我详述了如何通过更新证书来建立集群之间的互信。更新证书在很多的情况下,可能并不是最好的途径。在今天的文章中,我将详述如何在不更新证书的情况下,为集群之间建立互信。

在今天的展示中,我将使用如下的架构:

如上所示,我们创建两个不同的集群。它们分别运行于两个不同的机器上。它们使用不同的 IP 地址。我将使用最新的 Elastic Stack 8.4.1 来进行展示。

如何在不更新证书的情况下为集群之间建立互信

针对非 keystore 及 truststore 的安装

如果你的 Elasticsearch 的部署不是按照 keystore 及 truststore 来进行安装的,而是参照我之前的文章 “Security:如何安装 Elastic SIEM 和 EDR” 来进行安装的话,那么你可以直接把另外一个集群的证书添加到相应的 config/elasticsearch.yml 的配置中去即可:

config/elasticsearch.yml

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.key: /etc/elasticsearch/certs/elasticsearch.key
xpack.security.transport.ssl.certificate: /etc/elasticsearch/certs/elasticsearch.crt
xpack.security.transport.ssl.certificate_authorities: [ "/etc/elasticsearch/certs/ca/ca.crt", "certificate_from_another_cluster.crt ]

在这种情况下的配置就非常简单明了。我们就不赘述了。

安装

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考我之前的文章:

请注意选择 Elastic Stack 8.x 的安装指南。在默认的情况下,Elasticsearch 是带有 HTTPS 访问的配置。在启动 Elasticsearch 后,我们再次针对 config/elasticsearch.yml 做如下的修正:

config/elasticsearch.yml - macOS

 config/elasticsearch.yml - ubuntu

 为了能够在 macOS 上能够访问运行于 Ubuntu 上的 Kibana,我们可以针对 config/kibana.yml 做如下的修改:

config/kibana.yml - ubuntu

 从上面的配置中,我们可以看出来,Elasticsearch 的访问是配有 SSL 加密的。它们的证书存在于 Elasticsearch 的安装目录中:

macOS

$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1
$ ls config/certs/
http.p12      http_ca.crt   transport.p12

Ubuntu OS

liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ pwd
/home/liuxg/stack/elasticsearch-8.4.1
liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ls config/certs/
http.p12  http_ca.crt  transport.p12

为了获取在默认 Elasticsearch 安装中的证书,我们可以使用如下的命令,以 Ubuntu OS 为例:

liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ pwd
/home/liuxg/stack/elasticsearch-8.4.1
liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore list
warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password
liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
HNN9RjckQmiTxqgUXCNkIA
liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ cd config/certs/
liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ openssl pkcs12 -in transport.p12 -out ubuntu.crt -clcerts -nokeys
Enter Import Password:
liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ ls
http.p12  http_ca.crt  transport.p12  ubuntu.crt

在上面,我们利用 transport.p12 创建了一个叫做 ubuntu.crt 的证书。 我们把这个证书拷贝到 macOS 的证书目录下:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1
$ ls config/certs/
http.p12      http_ca.crt   transport.p12
$ cd config/certs/
$ scp liuxg@ubuntu:/home/liuxg/stack/elasticsearch-8.4.1/config/certs/ubuntu.crt .
ubuntu.crt                                                   100% 2048     1.5MB/s   00:00    
$ ls
http.p12      http_ca.crt   transport.p12 ubuntu.crt

我接下来,按照同样的方法,在 macOS 下创建同样的证书 mac.crt 文件:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1
$ ./bin/elasticsearch-keystore list
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password
$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
8CzmafQ0R-qLsiJfCM60jA
$ cd config/certs/
$ openssl pkcs12 -in transport.p12 -out mac.crt -clcerts -nokeys
Enter Import Password:
$ ls
http.p12      http_ca.crt   mac.crt       transport.p12

我们把这个 mac.crt 的证书拷贝到 Ubuntu 下的 Elasticsearch 安装目录中:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1
$ ./bin/elasticsearch-keystore list
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password
$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
8CzmafQ0R-qLsiJfCM60jA
$ cd config/certs/
$ openssl pkcs12 -in transport.p12 -out mac.crt -clcerts -nokeys
Enter Import Password:
$ ls
http.p12      http_ca.crt   mac.crt       transport.p12
$ scp mac.crt liuxg@ubuntu:/home/liuxg/stack/elasticsearch-8.4.1/config/certs
mac.crt                                                      100% 2060     1.1MB/s   00:00 

我们可以在 Ubuntu OS 的相应目录中进行查看:

liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ pwd
/home/liuxg/stack/elasticsearch-8.4.1/config/certs
liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ ls 
http.p12  http_ca.crt  mac.crt  transport.p12  ubuntu.crt

我们可以使用如下的命令来获得 macOS 下 transport.p12 truststore 的密码信息:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1
$ ./bin/elasticsearch-keystore list
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password
$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
8CzmafQ0R-qLsiJfCM60jA

我们可以使用如下的命令来查看当前 transport.p12 的证书信息:

$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1
$ ./bin/elasticsearch-keystore list
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password
$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
8CzmafQ0R-qLsiJfCM60jA
$ cd config/certs/
$ ls
http.p12      http_ca.crt   mac.crt       transport.p12 ubuntu.crt
$ keytool -keystore transport.p12 -list
Enter keystore password:  
Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 2 entries

transport, Sep 13, 2022, PrivateKeyEntry, 
Certificate fingerprint (SHA-256): 62:CF:21:3C:3A:75:24:53:2B:78:11:9D:AF:D0:EE:1E:26:01:93:71:5E:40:36:8B:3F:7A:7E:E9:01:B5:28:98
transport_ca, Sep 13, 2022, trustedCertEntry, 
Certificate fingerprint (SHA-256): 12:C7:9E:75:28:3B:65:36:10:FA:62:F9:5B:22:B4:D3:AC:18:0D:9B:5F:8D:E9:AE:0F:42:46:2D:D0:68:75:CA

 从上面,我们可以看出来,它里面有两个证书。现在我们使用如下的方法把 ubuntu.crt 这个证书添加到 transport.p12 这个 truststore 里去。

$ pwd
/Users/liuxg/elastic/elasticsearch-8.4.1/config/certs
$ keytool -importcert -trustcacerts -noprompt -keystore transport.p12 -storepass 8CzmafQ0R-qLsiJfCM60jA -alias ubuntu -file ubuntu.crt
Certificate was added to keystore
$ keytool -keystore transport.p12 -list
Enter keystore password:  
Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 3 entries

transport, Sep 13, 2022, PrivateKeyEntry, 
Certificate fingerprint (SHA-256): 62:CF:21:3C:3A:75:24:53:2B:78:11:9D:AF:D0:EE:1E:26:01:93:71:5E:40:36:8B:3F:7A:7E:E9:01:B5:28:98
transport_ca, Sep 13, 2022, trustedCertEntry, 
Certificate fingerprint (SHA-256): 12:C7:9E:75:28:3B:65:36:10:FA:62:F9:5B:22:B4:D3:AC:18:0D:9B:5F:8D:E9:AE:0F:42:46:2D:D0:68:75:CA
ubuntu, Sep 13, 2022, trustedCertEntry, 
Certificate fingerprint (SHA-256): CC:73:BC:61:52:17:42:6C:3D:4F:BF:7F:F1:2B:27:17:62:EA:FA:02:E6:46:27:5B:18:50:FF:CF:79:42:46:A6

 在上面的命令中, 8CzmafQ0R-qLsiJfCM60jA  是我们当前 macOS 的 transport.p12 这个 truststore 的密码。从上面的返回结果中,我们可以看出来 ubuntu 的证书已经成功地被添加进到 transport.p12 这个 truststore 里去了。

按照同样的方法,我们可以把 mac.crt 这个证书添加到 Ubuntu 机器上的 Elasticsearch 中的 transport.p12 truststore 里去。

liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ pwd
/home/liuxg/stack/elasticsearch-8.4.1
liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore list
warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
keystore.seed
xpack.security.http.ssl.keystore.secure_password
xpack.security.transport.ssl.keystore.secure_password
xpack.security.transport.ssl.truststore.secure_password
liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
HNN9RjckQmiTxqgUXCNkIA
liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ cd config/certs/
liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ ls
http.p12  http_ca.crt  mac.crt  transport.p12  ubuntu.crt
liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ keytool -importcert -trustcacerts -noprompt -keystore transport.p12 -storepass HNN9RjckQmiTxqgUXCNkIA -alias mac -file mac.crt
Certificate was added to keystore
liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ keytool -keystore transport.p12 -list
Enter keystore password:  
Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 3 entries

mac, Sep 13, 2022, trustedCertEntry, 
Certificate fingerprint (SHA-256): 62:CF:21:3C:3A:75:24:53:2B:78:11:9D:AF:D0:EE:1E:26:01:93:71:5E:40:36:8B:3F:7A:7E:E9:01:B5:28:98
transport, Sep 13, 2022, PrivateKeyEntry, 
Certificate fingerprint (SHA-256): CC:73:BC:61:52:17:42:6C:3D:4F:BF:7F:F1:2B:27:17:62:EA:FA:02:E6:46:27:5B:18:50:FF:CF:79:42:46:A6
transport_ca, Sep 13, 2022, trustedCertEntry, 
Certificate fingerprint (SHA-256): 88:75:60:B4:75:0E:72:58:00:0F:A9:FB:40:12:AB:BD:0D:7F:C7:18:E7:D4:0F:41:E5:38:10:D1:45:8F:4C:1A

从上面的输出中,我们已经成功地把 mac.crt 这个证书添加到 Ubuntu 下的 Elasticsearch 安装文件 transport.p12 这个 truststore 中去了。

提示:如果我们想删除已经添加的证书,我们可以使用如下的命令:

keytool -delete -noprompt -alias mac -keystore transport.p12 -storepass HNN9RjckQmiTxqgUXCNkIA

我们重新启动 macOS  及 Ubuntu 上的两个 Elasticsearch 集群。我们接着在 macOS 安装的 Kibana 中进行如下的操作:

上面显示我们的连接是成功的。当然,我们也可以在 Ubuntu 机器安装的 Elasticsearch 来连接 macOS 上的安装,它也应该是成功的:

测试 CCS 

一旦我们的 remote cluster 的连接是成功的,我们就可以放心地使用 CCS。如果你对 CCS 还不是很熟的话,请参考我之前的文章 ‘Elasticsearch:跨集群搜索 Cross-cluster search (CCS)”。我们在 Ubuntu OS 里的 Kibana 中打入如下的命令:

PUT twitter/_doc/1

  "content": "This is Xiaoguo, Liu from Elastic"

上述命令将生成一个叫做 twitter 的索引,尽管它仅有一个文档。

我们接下来在 macOS 里的 Kibana 中打入如下的命令来对 Ubuntu OS 中的 twitter 索引进行搜索:

GET ubuntu:twitter/_search

很显然,它能够针对在另外一个集群中的索引 twitter 进行搜索。 

参考:

【1】Generating a KeyStore and TrustStore (Configuring Java CAPS for SSL Support)

【2】MicroStrategy Community

以上是关于Elasticsearch:如何在不更新证书的情况下为集群之间建立互信的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在不强制断开连接的情况下使用 Go TLS 手动验证客户端证书?

如何在不使用 OpenSSL 的情况下使用私钥导出 base64 编码的 x.509 证书

Elasticsearch证书过期更新

ElasticSearch使用 _validate API 在不执行查询的情况下验证查询

我可以在不使用 HTTPS 连接的情况下使用 SSL 证书吗?