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

1,257 阅读6分钟

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

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

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

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

安装

如果你还没有安装好自己的 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



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


Ubuntu OS



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


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

`

1.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ pwd
2.  /home/liuxg/stack/elasticsearch-8.4.1
3.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore list
4.  warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
5.  keystore.seed
6.  xpack.security.http.ssl.keystore.secure_password
7.  xpack.security.transport.ssl.keystore.secure_password
8.  xpack.security.transport.ssl.truststore.secure_password
9.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
10.  warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
11.  HNN9RjckQmiTxqgUXCNkIA
12.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ cd config/certs/
13.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ openssl pkcs12 -in transport.p12 -out ubuntu.crt -clcerts -nokeys
14.  Enter Import Password:
15.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ ls
16.  http.p12  http_ca.crt  transport.p12  ubuntu.crt

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

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



1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.4.1
3.  $ ls config/certs/
4.  http.p12      http_ca.crt   transport.p12
5.  $ cd config/certs/
6.  $ scp liuxg@ubuntu:/home/liuxg/stack/elasticsearch-8.4.1/config/certs/ubuntu.crt .
7.  ubuntu.crt                                                   100% 2048     1.5MB/s   00:00    
8.  $ ls
9.  http.p12      http_ca.crt   transport.p12 ubuntu.crt


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



1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.4.1
3.  $ ./bin/elasticsearch-keystore list
4.  keystore.seed
5.  xpack.security.http.ssl.keystore.secure_password
6.  xpack.security.transport.ssl.keystore.secure_password
7.  xpack.security.transport.ssl.truststore.secure_password
8.  $ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
9.  8CzmafQ0R-qLsiJfCM60jA
10.  $ cd config/certs/
11.  $ openssl pkcs12 -in transport.p12 -out mac.crt -clcerts -nokeys
12.  Enter Import Password:
13.  $ ls
14.  http.p12      http_ca.crt   mac.crt       transport.p12


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

`1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.4.1
3.  $ ./bin/elasticsearch-keystore list
4.  keystore.seed
5.  xpack.security.http.ssl.keystore.secure_password
6.  xpack.security.transport.ssl.keystore.secure_password
7.  xpack.security.transport.ssl.truststore.secure_password
8.  $ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
9.  8CzmafQ0R-qLsiJfCM60jA
10.  $ cd config/certs/
11.  $ openssl pkcs12 -in transport.p12 -out mac.crt -clcerts -nokeys
12.  Enter Import Password:
13.  $ ls
14.  http.p12      http_ca.crt   mac.crt       transport.p12
15.  $ scp mac.crt liuxg@ubuntu:/home/liuxg/stack/elasticsearch-8.4.1/config/certs
16.  mac.crt                                                      100% 2060     1.1MB/s   00:00` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

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



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


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



1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.4.1
3.  $ ./bin/elasticsearch-keystore list
4.  keystore.seed
5.  xpack.security.http.ssl.keystore.secure_password
6.  xpack.security.transport.ssl.keystore.secure_password
7.  xpack.security.transport.ssl.truststore.secure_password
8.  $ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
9.  8CzmafQ0R-qLsiJfCM60jA


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

`

1.  $ pwd
2.  /Users/liuxg/elastic/elasticsearch-8.4.1
3.  $ ./bin/elasticsearch-keystore list
4.  keystore.seed
5.  xpack.security.http.ssl.keystore.secure_password
6.  xpack.security.transport.ssl.keystore.secure_password
7.  xpack.security.transport.ssl.truststore.secure_password
8.  $ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
9.  8CzmafQ0R-qLsiJfCM60jA
10.  $ cd config/certs/
11.  $ ls
12.  http.p12      http_ca.crt   mac.crt       transport.p12 ubuntu.crt
13.  $ keytool -keystore transport.p12 -list
14.  Enter keystore password:  
15.  Keystore type: PKCS12
16.  Keystore provider: SUN

18.  Your keystore contains 2 entries

20.  transport, Sep 13, 2022, PrivateKeyEntry, 
21.  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
22.  transport_ca, Sep 13, 2022, trustedCertEntry, 
23.  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

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

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

`

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

10.  Your keystore contains 3 entries

12.  transport, Sep 13, 2022, PrivateKeyEntry, 
13.  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
14.  transport_ca, Sep 13, 2022, trustedCertEntry, 
15.  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
16.  ubuntu, Sep 13, 2022, trustedCertEntry, 
17.  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

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

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

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

`

1.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ pwd
2.  /home/liuxg/stack/elasticsearch-8.4.1
3.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore list
4.  warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
5.  keystore.seed
6.  xpack.security.http.ssl.keystore.secure_password
7.  xpack.security.transport.ssl.keystore.secure_password
8.  xpack.security.transport.ssl.truststore.secure_password
9.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ ./bin/elasticsearch-keystore show xpack.security.transport.ssl.truststore.secure_password
10.  warning: ignoring JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64; using bundled JDK
11.  HNN9RjckQmiTxqgUXCNkIA
12.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1$ cd config/certs/
13.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ ls
14.  http.p12  http_ca.crt  mac.crt  transport.p12  ubuntu.crt
15.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ keytool -importcert -trustcacerts -noprompt -keystore transport.p12 -storepass HNN9RjckQmiTxqgUXCNkIA -alias mac -file mac.crt
16.  Certificate was added to keystore
17.  liuxg@liuxgu:~/stack/elasticsearch-8.4.1/config/certs$ keytool -keystore transport.p12 -list
18.  Enter keystore password:  
19.  Keystore type: PKCS12
20.  Keystore provider: SUN

22.  Your keystore contains 3 entries

24.  mac, Sep 13, 2022, trustedCertEntry, 
25.  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
26.  transport, Sep 13, 2022, PrivateKeyEntry, 
27.  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
28.  transport_ca, Sep 13, 2022, trustedCertEntry, 
29.  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

`![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)

从上面的输出中,我们已经成功地把 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 中打入如下的命令:



1.  PUT twitter/_doc/1
2.  {
3.    "content": "This is Xiaoguo, Liu from Elastic"
4.  }


上述命令将生成一个叫做 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