我们知道,建立集群之间的互信非常重要。这个是为我们进行 CCR 及 CCS 操作的基础。只有建立好了集群之间的互信,我们才可以创建集群之间的 remote connection。特别是针对含有 SSL 连接的集群,他们含有各自的证书,那么我们该如何建立集群之间的互信呢?在我之前的文章 “Elasticsearch:如何为 CCR 及 CCS 建立带有安全的集群之间的互信” 中,我详述了如何通过更新证书来建立集群之间的互信。更新证书在很多的情况下,可能并不是最好的途径。在今天的文章中,我将详述如何在不更新证书的情况下,为集群之间建立互信。
在今天的展示中,我将使用如下的架构:
如上所示,我们创建两个不同的集群。它们分别运行于两个不同的机器上。它们使用不同的 IP 地址。我将使用最新的 Elastic Stack 8.4.1 来进行展示。
如何在不更新证书的情况下为集群之间建立互信
安装
如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考我之前的文章:
- 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch
- Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 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
`
在上面,我们利用 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` 
我们可以在 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
`
从上面,我们可以看出来,它里面有两个证书。现在我们使用如下的方法把 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
`
在上面的命令中, 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
`
从上面的输出中,我们已经成功地把 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)