Appearance
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
路径下。测试时,您可以尝试使用带有密码 placeholder
的 testcert.pfx
文件。Garnet 仓库中的示例测试证书是自签名的,并且默认不受信任。此外,它们可能使用过时的哈希和密码套件,可能不够安全。为了更好的安全性,请购买由知名证书颁发机构签名的证书。这些证书仅可用于开发/测试环境。
使用与 RESP 兼容的 TLS 客户端
要连接 RESP 客户端到 Garnet,您需要一个服务器证书、一个私钥和一个 CA 证书文件。例如,启动客户端时提供以下参数:
bash
--cacert garnet-ca.crt
--cert garnet-cert.crt
--key garnet.key
生成您自己的自签名证书
如果您需要为测试 TLS 与 Garnet Server 生成自签名证书,请按照以下步骤操作。
安装 openssl 库
Linux 发行版:
bashsudo apt install openssl
Windows 系统:
从 OpenSSL wiki 中选择最合适的选项
执行以下命令:
2.1 创建根密钥
bashopenssl ecparam -out <issuer-name>.key -name prime256v1 -genkey
2.2 创建根证书并进行自签名:
使用以下命令生成证书签名请求(CSR)。
bashopenssl req -new -sha256 -key <issuer-name>.key -out <issuer-name>.csr
注意:在提示时,输入根密钥的密码以及自定义 CA 的组织信息,例如 Country/Region、State、Org、OU 和发行者的名称。
使用以下命令生成根证书:
bashopenssl x509 -req -sha256 -days 365 -in <issuer-name>.csr -signkey <issuer-name>.key -out <issuer-name>.crt
这将用于签署您的服务器证书。
2.3 创建证书的密钥
注意:此服务器名称必须与发行者的名称不同。
bashopenssl ecparam -out <server-name>.key -name prime256v1 -genkey
2.4 创建 CSR(证书签名请求)
bashopenssl req -new -sha256 -key <server-name>.key -out <server-name>.csr
注意:在提示时,输入根密钥的密码以及自定义 CA 的组织信息:Country/Region、State、Org、OU 和完全限定域名。
这是服务器的域名,应与发行者不同。
2.5 使用 CSR 和密钥生成证书,并使用 CA 的根密钥签名它
bashopenssl x509 -req -in <server-name>.csr -CA <issuer-name>.crt -CAkey <issuer-name>.key -CAcreateserial -out <server-name>.crt -days 365 -sha256
2.6 验证新创建的证书
bashopenssl 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
bashopenssl pkcs12 -in testcert.pfx -nocerts -nodes -out garnet.key
Certificate
bashopenssl pkcs12 -in testcert.pfx -clcerts -nokeys -out garnet-cert.crt
CA cacert
bashopenssl 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 部署中获得基本的安全功能。请根据您团队的安全要求检查此功能是否足以满足您的需求。请注意,如果启用了大于内存的数据,则不会加密溢出到本地磁盘或检查点的数据。我们也不会加密内存中提供的实际数据。