保护你的 Garnet 部署

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 是否检查证书吊销。你也可以通过 cert-subject-name 在 Windows 上使用主题名称的证书。证书刷新可以通过 --cert-refresh-freq 选项自动完成。

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

如果你通过 NuGet 托管自己的 GarnetServer,你可以通过传入你的 IGarnetTlsOptions 实现的实例直接指定 SSL 连接选项,我们有一个这样的原型样本作为 GarnetTlsOptions.cs

提示

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

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

注意:

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

使用 RESP 兼容客户端与 TLS

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

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

生成自己的自签名证书

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

  1. 安装 openssl 库

    对于 Linux 发行版:

    1. sudo apt install openssl

    对于 Windows 系统:

    OpenSSL wiki 选择最合适的选项

  2. 运行以下命令:

    2.1 创建根密钥

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

    2.2 创建根证书并自签名:

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

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

    注意:提示时,输入根密钥的密码,以及自定义 CA 的组织信息,如国家/地区、州、组织、单位和发行者名称。

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

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

    这将用于签名你的服务器证书。

    2.3 创建证书的密钥

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

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

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

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

    注意:提示时,输入根密钥的密码,以及自定义 CA 的组织信息:国家/地区、州、组织、单位和完全限定域名。

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

    2.5 使用 CSR、密钥和发行者的根密钥生成证书并签名

    1. 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 验证新创建的证书

    1. 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 工具提取所有的证书和密钥:

  • 密钥

    1. openssl pkcs12 -in testcert.pfx -nocerts -nodes -out garnet.key
  • 证书

    1. openssl pkcs12 -in testcert.pfx -clcerts -nokeys -out garnet-cert.crt
  • CA 证书

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

密码保护会话

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

  • NoAuth,默认情况下没有密码要求。
  1. GarnetServer --auth NoAuth
  • Password,指示服务器客户端在发送请求之前应使用 auth 命令和密码。

启动服务器时包含密码:

  1. GarnetServer --auth Password --password <passwordplaceholder>

通过这两个特性,你可以获得 Garnet 部署的基本安全能力。请与你的团队安全需求核对,这个功能是否足以满足你的需求。请注意,如果启用了大于内存的数据,我们不加密溢写到本地磁盘的数据,或者检查点。我们也不加密内存中实际服务的数据。