使用 TLS 传输加密

最近更新时间: 2022-10-26 18:22:09

使用 TLS 传输加密

TLS

TDMQ支持与Apache Pulsar兼容,因此可实现TLS传输加密的配置。默认情况下,TDMQ客户端以纯文本形式与服务通信。这意味着所有数据都以明文形式发送。您可以使用 TLS 加密此流量,以保护流量免受中间人攻击者的窥探。

请注意,启用 TLS 可能会因加密开销而影响性能。

TLS概述

TLS 是一种形式。使用由公钥和私钥组成的密钥对可以执行加密。公钥加密消息,私钥解密消息。

要使用 TLS 传输加密,您需要两种密钥对,服务器密钥对证书颁发机构

您可以使用第三种密钥对,客户端密钥对,用于客户端身份验证。

您应该将证书颁发机构的私钥存储在非常安全的位置(完全加密、断开连接、有气隙的计算机)。至于证书颁发机构的公钥,信任证书,您可以自由共享。

对于客户端和服务器密钥对,管理员首先生成私钥和证书请求,然后使用证书颁发机构私钥对证书请求进行签名,最后生成证书。此证书是服务器/客户端密钥对的公钥。

对于 TLS 传输加密,客户端可以使用信任证书来验证服务器是否具有在客户端与服务器通信时证书颁发机构签署的密钥对。中间人攻击者无权访问证书颁发机构,因此他们无法使用这样的密钥对创建服务器。

对于 TLS 身份验证,服务器使用信任证书来验证客户端是否具有证书颁发机构签署的密钥对。然后将客户端证书的通用名称用作客户端的角色令牌(请参阅概述)。

创建 TLS证书

请按照以下指南设置证书颁发机构。。

认证机构

  1. 为 CA 创建证书。您可以使用 CA 对代理和客户端证书进行签名。这确保了每一方都会信任其他方。您应该将 CA 存储在非常安全的位置(理想情况下完全与网络断开连接、隔离并完全加密)。
  2. 输入以下命令为您的 CA 创建一个目录,并将openssl 配置文件放在该目录中。您可能需要在配置文件中修改公司名称和部门的默认答案。将 CA 目录的位置导出到环境变量 CA_HOME。配置文件使用此环境变量来查找 CA 需要的其余文件和目录。
mkdir my-ca
cd my-ca
wget https://raw.githubusercontent.com/apache/pulsar-site/main/site2/website/static/examples/openssl.cnf
export CA_HOME=$(pwd)
  1. 输入以下命令以创建必要的目录、密钥和证书。
mkdir certs crl newcerts private
chmod 700 private/
touch index.txt
echo 1000 > serial
openssl genrsa -aes256 -out private/ca.key.pem 4096
# You need enter a password in the command above
chmod 400 private/ca.key.pem
openssl req -config openssl.cnf -key private/ca.key.pem \
    -new -x509 -days 7300 -sha256 -extensions v3_ca \
    -out certs/ca.cert.pem
# You must enter the same password in the previous openssl command
chmod 444 certs/ca.cert.pem

小费

macOS 上的默认设置openssl不适用于上述命令。openssl您必须通过 Homebrew升级:

brew install openssl
export PATH="/usr/local/Cellar/openssl@3/3.0.1/bin:$PATH"

未来版本3.0.1可能会发生变化。使用brew install命令输出中的实际路径。

  1. 在您回答问题提示后,CA 相关文件将存储在该./my-ca目录中。在该目录中:
  • certs/ca.cert.pem是公共证书。此公共证书旨在分发给所有相关方。
  • private/ca.key.pem是私钥。只有在为经纪人或客户签署新证书时才需要它,并且必须安全地保护此私钥。

服务器证书

创建 CA 证书后,您可以创建证书请求并使用 CA 对其进行签名。

以下命令会询问您几个问题,然后创建证书。当您被要求提供公用名时,您应该与代理的主机名匹配。您还可以使用通配符来匹配一组代理主机名,例如*.broker.usw.example.com. 这确保了多台机器可以重用相同的证书。

小费

有时匹配主机名是不可能的或没有意义的,例如当您使用随机主机名创建代理时,或者您计划通过其 IP 连接到主机时。在这些情况下,您应该将客户端配置为禁用 TLS 主机名验证。。

  1. 输入以下命令生成密钥。
openssl genrsa -out broker.key.pem 2048

代理希望密钥为PKCS 8格式,因此输入以下命令进行转换。

openssl pkcs8 -topk8 -inform PEM -outform PEM \
      -in broker.key.pem -out broker.key-pk8.pem -nocrypt
  1. 输入以下命令以生成证书请求。
openssl req -config openssl.cnf \
    -key broker.key.pem -new -sha256 -out broker.csr.pem
  1. 通过输入以下命令,使用证书颁发机构对其进行签名。
openssl ca -config openssl.cnf -extensions server_cert \
    -days 1000 -notext -md sha256 \
    -in broker.csr.pem -out broker.cert.pem

此时,您有一个证书broker.cert.pem和一个密钥 ,broker.key-pk8.pem您可以使用它们ca.cert.pem来为您的代理和代理节点配置 TLS 传输加密。

配置代理

要将 Pulsar代理配置为使用 TLS 传输加密,您需要对broker.conf位于Pulsar 安装conf目录中的进行一些更改。

将这些值添加到配置文件(在必要时替换适当的证书路径):

brokerServicePortTls=6651
webServicePortTls=8081
tlsRequireTrustedClientCertOnConnect=true
tlsCertificateFilePath=/path/to/broker.cert.pem
tlsKeyFilePath=/path/to/broker.key-pk8.pem
tlsTrustCertsFilePath=/path/to/ca.cert.pem

您可以在代理配置中找到文件中可用参数的完整列表conf/broker.conf,以及这些参数的默认值

TLS 协议版本和密码

您可以将代理(和代理)配置为需要特定的 TLS 协议版本和密码以进行 TLS 协商。您可以使用 TLS 协议版本和密码来阻止客户端请求可能存在弱点的降级 TLS 协议版本或密码。

TLS 协议版本和密码属性都可以采用多个值,以逗号分隔。协议版本和密码的可能值取决于您使用的 TLS 提供程序。如果 OpenSSL 可用,则 Pulsar 使用 OpenSSL,但如果 OpenSSL 不可用,则 Pulsar 默认回到 JDK 实现。

tlsProtocols=TLSv1.3,TLSv1.2
tlsCiphers=TLS_DH_RSA_WITH_AES_256_GCM_SHA384,TLS_DH_RSA_WITH_AES_256_CBC_SHA

OpenSSL 目前支持TLSv1.1,TLSv1.2TLSv1.3为协议版本。您可以从 openssl ciphers 命令获取支持的密码列表,即openssl ciphers -tls1_3.

代理配置

代理需要在两个方向上配置 TLS,客户端连接代理,代理连接代理。

# For clients connecting to the proxy
tlsEnabledInProxy=true
tlsCertificateFilePath=/path/to/broker.cert.pem
tlsKeyFilePath=/path/to/broker.key-pk8.pem
tlsTrustCertsFilePath=/path/to/ca.cert.pem

# For the proxy to connect to brokers
tlsEnabledWithBroker=true
brokerClientTrustCertsFilePath=/path/to/ca.cert.pem

客户端配置

启用 TLS 传输加密时,您需要将客户端配置为使用https://Web 服务 URL 的端口 8443 和pulsar+ssl://代理服务 URL 的端口 6651。

由于您上面生成的服务器证书不属于任何默认信任链,您还需要指定信任证书的路径(推荐),或者告诉客户端允许不受信任的服务器证书。

主机名验证

主机名验证是 TLS 安全功能,如果“CommonName”与主机名连接的主机名不匹配,客户端可以拒绝连接到服务器。默认情况下,Pulsar 客户端禁用主机名验证,因为它要求每个代理都有一个 DNS 记录和一个唯一的证书。

此外,由于管理员对证书颁发机构拥有完全控制权,因此不良行为者不太可能发起中间人攻击。“allowInsecureConnection”允许客户端连接到其证书未经批准的 CA 签名的服务器。客户端默认禁用“allowInsecureConnection”,您应该在生产环境中始终禁用“allowInsecureConnection”。只要您禁用“allowInsecureConnection”,中间人攻击就要求攻击者有权访问 CA。

您可能想要启用主机名验证的一种情况是,您在 VIP 后面有多个代理节点,并且 VIP 具有 DNS 记录,例如 pulsar.mycompany.com。在这种情况下,您可以使用 pulsar.mycompany.com 作为“CommonName”生成 TLS 证书,然后在客户端上启用主机名验证。