Skip to content

Garnet 使用内置于 .NET 中的 SslStream 功能支持 TLS/SSL 连接。您可以启用端到端加密功能来实现此功能,接下来将进行讨论。 此外,Garnet 还支持基于密码的基本身份验证,在 RESP 中的 AUTH 命令之后进行,这将在本节末尾讨论。

TLS 配置

要使用 TLS 使用 Garnet,您可以创建自己的证书。严格用于测试目的,我们在 <root>/test/testcerts 目录下包含了测试证书文件。您需要启动服务器和客户端来启用 TLS 加密。

使用带有 TLS 的 GarnetServer

在服务器端,您需要启动带有 TLS 功能的 Garnet。从命令提示符中,添加的参数包括 --tls 以启用 TLS,通过 --cert-file-name 指定证书名称(我们仅接受 .pfx 文件),通过 --cert-password 指定 TLS 证书密码,通过 --client-certificate-required 指定是否需要 TLS 客户端证书,通过 --issuer-certificate-path 指定要验证的发行者证书,并通过 --certificate-revocation-check-mode 指定 TLS 检查证书吊销的方式。您还可以在 Windows 上通过 cert-subject-name 使用主题名称的证书。证书刷新可以通过选项 --cert-refresh-freq 自动进行。

bash
    GarnetServer --tls --cert-file-name testcert.pfx --cert-password placeholder

如果您通过 NuGet 托管您自己的 GarnetServer,可以通过传递您的 IGarnetTlsOptions 实现的实例直接指定 SSL 连接选项,我们有一个原型示例 GarnetTlsOptions.cs。

TIP

如果您有 .key 和 .crt 格式的私钥和公钥文件,可以使用 openssl 创建 .pfx 格式:

bash
    openssl pkcs12 -inkey <server-name>.key -in <server-name>.crt -export -out server-cert.pfx

Note:

仓库中包含一个测试 .pfx 文件,位于 <root>/test/testcerts 路径下。测试时,您可以尝试使用带有密码 placeholdertestcert.pfx 文件。Garnet 仓库中的示例测试证书是自签名的,并且默认不受信任。此外,它们可能使用过时的哈希和密码套件,可能不够安全。为了更好的安全性,请购买由知名证书颁发机构签名的证书。这些证书仅可用于开发/测试环境。

使用与 RESP 兼容的 TLS 客户端

要连接 RESP 客户端到 Garnet,您需要一个服务器证书、一个私钥和一个 CA 证书文件。例如,启动客户端时提供以下参数:

bash
    --cacert garnet-ca.crt
    --cert garnet-cert.crt 
    --key garnet.key

生成您自己的自签名证书

如果您需要为测试 TLS 与 Garnet Server 生成自签名证书,请按照以下步骤操作。

  1. 安装 openssl 库

    Linux 发行版:

    bash
    sudo apt install openssl

    Windows 系统:

    OpenSSL wiki 中选择最合适的选项

  2. 执行以下命令:

    2.1 创建根密钥

    bash
    openssl ecparam -out <issuer-name>.key -name prime256v1 -genkey

    2.2 创建根证书并进行自签名:

    使用以下命令生成证书签名请求(CSR)。

    bash
    openssl req -new -sha256 -key <issuer-name>.key -out <issuer-name>.csr

    注意:在提示时,输入根密钥的密码以及自定义 CA 的组织信息,例如 Country/Region、State、Org、OU 和发行者的名称。

    使用以下命令生成根证书:

    bash
    openssl x509 -req -sha256 -days 365 -in <issuer-name>.csr -signkey <issuer-name>.key -out <issuer-name>.crt

    这将用于签署您的服务器证书。

    2.3 创建证书的密钥

    注意:此服务器名称必须与发行者的名称不同。

    bash
    openssl ecparam -out <server-name>.key -name prime256v1 -genkey

    2.4 创建 CSR(证书签名请求)

    bash
    openssl req -new -sha256 -key <server-name>.key -out <server-name>.csr

    注意:在提示时,输入根密钥的密码以及自定义 CA 的组织信息:Country/Region、State、Org、OU 和完全限定域名。

    这是服务器的域名,应与发行者不同。

    2.5 使用 CSR 和密钥生成证书,并使用 CA 的根密钥签名它

    bash
    openssl x509 -req -in <server-name>.csr -CA <issuer-name>.crt -CAkey <issuer-name>.key -CAcreateserial -out <server-name>.crt -days 365 -sha256

    2.6 验证新创建的证书

    bash
    openssl x509 -in <server-name>.crt -text -noout

    这将显示您输入的证书信息,您还将看到发行者数据和主题(服务器名称)。

    2.7 验证您目录中的文件,并确保您拥有以下文件:

    <issuer-name>.crt

    <issuer-name>.key

    <server-name>.crt

    <server-name>.key

使用 openssl 分别导出证书

如果您有一个以 pfx 格式的证书,您可以使用 openssl 工具提取所有的证书和密钥:

  • Key

    bash
    openssl pkcs12 -in testcert.pfx -nocerts -nodes -out garnet.key
  • Certificate

    bash
    openssl pkcs12 -in testcert.pfx -clcerts -nokeys -out garnet-cert.crt
  • CA cacert

    bash
    openssl pkcs12 -in testcert.pfx -cacerts -nokeys -chain -out garnet-ca.crt

加密会话

Garnet 支持加密会话,使用 RESP 协议的 AUTH 机制。当您创建一个 Garnet 服务器时,您可以通过标志 --auth 和要启用的身份验证类型来指定启用身份验证。以下是启用或禁用密码保护连接的选项:

  • NoAuth,默认情况下不需要密码。
bash
    GarnetServer --auth NoAuth
  • Password,指示客户端在发送请求之前应使用 auth 命令和密码。

在启动服务器时包括密码:

bash
    GarnetServer --auth Password --password <passwordplaceholder>

有了这两个功能,您可以在 Garnet 部署中获得基本的安全功能。请根据您团队的安全要求检查此功能是否足以满足您的需求。请注意,如果启用了大于内存的数据,则不会加密溢出到本地磁盘或检查点的数据。我们也不会加密内存中提供的实际数据。