Link Search Menu Expand Document Documentation Menu

生成自签名证书

如果您无法访问您组织的证书颁发机构 (CA) 但想将 OpenSearch 用于非演示目的,可以使用 OpenSSL 生成您自己的自签名证书。

您可能可以在操作系统的包管理器中找到 OpenSSL。

在 CentOS 上,使用 Yum

sudo yum install openssl

在 macOS 上,使用 Homebrew

brew install openssl

生成私钥

此过程的第一步是使用 openssl genrsa 命令生成私钥。顾名思义,您应该将此文件保密。

私钥必须有足够的长度才能安全,因此请指定 2048

openssl genrsa -out root-ca-key.pem 2048

您可以选择添加 -aes256 选项以使用 AES-256 标准加密密钥。此选项需要密码。

生成根证书

接下来,使用私钥为根 CA 生成自签名证书

openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem -days 730

默认的 -days 值 30 仅适用于测试目的。此示例命令将证书过期日期指定为 730(两年),但请使用适合您组织的值。

  • -x509 选项指定您要的是自签名证书而不是证书请求。
  • -sha256 选项将哈希算法设置为 SHA-256。SHA-256 是较新版本 OpenSSL 的默认值,但早期版本可能使用 SHA-1。

按照提示指定您组织的详细信息。这些详细信息共同构成了您的 CA 的识别名 (DN)。

生成管理证书

要生成管理证书,首先创建一个新密钥

openssl genrsa -out admin-key-temp.pem 2048

然后将该密钥转换为 PKCS#8 格式,以便在 Java 中使用与 PKCS#12 兼容的算法 (3DES)

openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem

接下来,创建一个证书签名请求 (CSR)。此文件充当向 CA 申请签名证书的应用程序

openssl req -new -key admin-key.pem -out admin.csr

按照提示填写详细信息。您无需指定质询密码。如 OpenSSL Cookbook 中所述,“设置质询密码不会以任何方式增加 CSR 的安全性。”

如果您生成 TLS 证书并已通过将 plugins.security.ssl.transport.enforce_hostname_verification 设置为 true(默认值)来启用主机名验证,请务必为每个证书签名请求 (CSR) 指定一个通用名称 (CN),该名称应与预期节点的相应 DNS A 记录匹配。

如果您希望在所有节点上使用相同的节点证书(不推荐),请将主机名验证设置为 false。有关更多信息,请参阅配置 TLS 证书

私钥和签名请求创建完成后,生成证书

openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 730

与根证书一样,使用 -days 选项指定长于 30 天的过期日期。

(可选)生成节点和客户端证书

生成管理证书中的步骤类似,您将为每个节点生成具有新文件名的密钥和 CSR,并生成所需数量的客户端证书。例如,您可以为 OpenSearch Dashboards 生成一个客户端证书,为 Python 客户端生成另一个。每个证书都应使用自己的私钥,并且应从具有与预期主机匹配的唯一 SAN 扩展名的唯一 CSR 生成。管理证书不需要 SAN 扩展,因为该证书不绑定到特定主机。

要生成节点或客户端证书,首先创建一个新密钥

openssl genrsa -out node1-key-temp.pem 2048

然后将该密钥转换为 PKCS#8 格式,以便在 Java 中使用与 PKCS#12 兼容的算法 (3DES)

openssl pkcs8 -inform PEM -outform PEM -in node1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node1-key.pem

接下来,创建 CSR

openssl req -new -key node1-key.pem -out node1.csr

对于所有主机和客户端证书,您应该指定一个主题备用名称 (SAN),以确保符合 RFC 2818 (HTTP Over TLS)。SAN 应与相应的 CN 匹配,以便两者都引用相同的 DNS A 记录。

在生成签名证书之前,创建一个 SAN 扩展文件来描述主机的 DNS A 记录。如果您连接到只有 IP 地址(IPv4 或 IPv6)的主机,请使用 IP 语法

无 IP

echo 'subjectAltName=DNS:node1.dns.a-record' > node1.ext

带 IP

echo subjectAltName=IP:127.0.0.1 > node1.ext

描述了 DNS A 记录后,生成证书

openssl x509 -req -in node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node1.pem -days 730 -extfile node1.ext

生成自签名 PEM 证书的示例脚本

如果您已经知道证书详细信息,并且不想以交互方式指定它们,请在 root-ca.pem 和 CSR 命令中使用 -subj 选项。此脚本创建一个根证书、一个管理证书、两个节点证书和一个客户端证书,所有这些证书的过期日期均为两年 (730 天)

#!/bin/sh
# Root CA
openssl genrsa -out root-ca-key.pem 2048
openssl req -new -x509 -sha256 -key root-ca-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=root.dns.a-record" -out root-ca.pem -days 730
# Admin cert
openssl genrsa -out admin-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in admin-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out admin-key.pem
openssl req -new -key admin-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=A" -out admin.csr
openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 730
# Node cert 1
openssl genrsa -out node1-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in node1-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node1-key.pem
openssl req -new -key node1-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=node1.dns.a-record" -out node1.csr
echo 'subjectAltName=DNS:node1.dns.a-record' > node1.ext
openssl x509 -req -in node1.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node1.pem -days 730 -extfile node1.ext
# Node cert 2
openssl genrsa -out node2-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in node2-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out node2-key.pem
openssl req -new -key node2-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=node2.dns.a-record" -out node2.csr
echo 'subjectAltName=DNS:node2.dns.a-record' > node2.ext
openssl x509 -req -in node2.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out node2.pem -days 730 -extfile node2.ext
# Client cert
openssl genrsa -out client-key-temp.pem 2048
openssl pkcs8 -inform PEM -outform PEM -in client-key-temp.pem -topk8 -nocrypt -v1 PBE-SHA1-3DES -out client-key.pem
openssl req -new -key client-key.pem -subj "/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=client.dns.a-record" -out client.csr
echo 'subjectAltName=DNS:client.dns.a-record' > client.ext
openssl x509 -req -in client.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out client.pem -days 730 -extfile client.ext
# Cleanup
rm admin-key-temp.pem
rm admin.csr
rm node1-key-temp.pem
rm node1.csr
rm node1.ext
rm node2-key-temp.pem
rm node2.csr
rm node2.ext
rm client-key-temp.pem
rm client.csr
rm client.ext

将 PEM 证书转换为密钥库和信任库文件的示例脚本

您可以使用以下脚本从之前生成的 PEM 证书生成密钥库和信任库

#!/bin/sh

# Convert node certificate
cat root-ca.pem node1.pem node1-key.pem > combined-node1.pem
echo "Enter password for node1-cert.p12"
openssl pkcs12 -export -in combined-node1.pem -out node1-cert.p12 -name node1
echo "Enter password for keystore.jks"
keytool -importkeystore -srckeystore node1-cert.p12 -srcstoretype pkcs12 -destkeystore keystore.jks

# Convert admin certificate
cat root-ca.pem admin.pem admin-key.pem > combined-admin.pem
echo "Enter password for admin-cert.p12"
openssl pkcs12 -export -in combined-admin.pem -out admin-cert.p12 -name admin
echo "Enter password for keystore.jks"
keytool -importkeystore -srckeystore admin-cert.p12 -srcstoretype pkcs12 -destkeystore keystore.jks

# Import certificates to truststore
keytool -importcert -keystore truststore.jks -file root-ca.cer -storepass changeit -trustcacerts -deststoretype pkcs12

# Cleanup
rm combined-admin.pem
rm combined-node1.pem

将识别名添加到 opensearch.yml

您必须在所有节点上的 opensearch.yml 中指定所有管理和节点证书的识别名 (DN)。使用上述示例脚本中的证书,opensearch.yml 的一部分可能如下所示

plugins.security.authcz.admin_dn:
  - 'CN=A,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'
plugins.security.nodes_dn:
  - 'CN=node1.dns.a-record,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=node2.dns.a-record,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'

但如果您在创建证书后查看证书的 subject,您可能会看到不同的格式

subject=/C=CA/ST=ONTARIO/L=TORONTO/O=ORG/OU=UNIT/CN=node1.dns.a-record

如果您将此字符串与上面的字符串进行比较,您会发现您需要反转元素的顺序并使用逗号而不是斜杠。输入此命令以获取正确的字符串

openssl x509 -subject -nameopt RFC2253 -noout -in node.pem

然后将输出复制并粘贴到 opensearch.yml 中。

将证书文件添加到 opensearch.yml

此过程生成许多文件,但您需要将这些文件添加到每个节点

  • root-ca.pem
  • (可选)admin.pem
  • (可选)admin-key.pem
  • (可选)node1.pem
  • (可选)node1-key.pem

对于大多数用户来说,admin.pemadmin-key.pem 文件只需添加到您计划运行 securityadmin 脚本或从中重新加载证书的节点。有关如何使用 securityadmin 脚本的信息,请参阅应用配置更改。如果您打算直接从节点运行 securityadmin 脚本,则该节点需要有 admin.pemadmin-key.pem 的副本。

在一个节点上,opensearch.yml 的安全配置部分可能如下所示

plugins.security.ssl.transport.pemcert_filepath: node1.pem
plugins.security.ssl.transport.pemkey_filepath: node1-key.pem
plugins.security.ssl.transport.pemtrustedcas_filepath: root-ca.pem
plugins.security.ssl.transport.enforce_hostname_verification: false
plugins.security.ssl.http.enabled: true
plugins.security.ssl.http.pemcert_filepath: node1.pem
plugins.security.ssl.http.pemkey_filepath: node1-key.pem
plugins.security.ssl.http.pemtrustedcas_filepath: root-ca.pem
plugins.security.authcz.admin_dn:
  - 'CN=A,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'
plugins.security.nodes_dn:
  - 'CN=node1.dns.a-record,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'
  - 'CN=node2.dns.a-record,OU=UNIT,O=ORG,L=TORONTO,ST=ONTARIO,C=CA'

有关在您自己的设置中添加和使用这些证书的更多信息,请参阅 Docker 的配置基本安全设置配置 TLS 证书客户端证书身份验证

OpenSearch Dashboards

有关使用根 CA 和客户端证书为 OpenSearch Dashboards 启用 TLS 的信息,请参阅为 OpenSearch Dashboards 配置 TLS