保护你的 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
选项自动完成。
GarnetServer --tls --cert-file-name testcert.pfx --cert-password placeholder
如果你通过 NuGet 托管自己的 GarnetServer,你可以通过传入你的 IGarnetTlsOptions
实现的实例直接指定 SSL 连接选项,我们有一个这样的原型样本作为 GarnetTlsOptions.cs
。
提示
如果你有以 .key 和 .crt 格式的私钥和公钥文件,你可以使用 openssl 创建 .pfx 格式:
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 证书文件。例如,启动客户端时提供以下参数:
--cacert garnet-ca.crt --cert garnet-cert.crt --key garnet.key
生成自己的自签名证书
如果你需要为测试 TLS 与 Garnet Server 生成自签名证书,请按照以下步骤操作。
安装 openssl 库
对于 Linux 发行版:
sudo apt install openssl
对于 Windows 系统:
从 OpenSSL wiki 选择最合适的选项
运行以下命令:
2.1 创建根密钥
openssl ecparam -out <issuer-name>.key -name prime256v1 -genkey
2.2 创建根证书并自签名:
使用以下命令生成证书签名请求 (CSR)。
openssl req -new -sha256 -key <issuer-name>.key -out <issuer-name>.csr
注意:提示时,输入根密钥的密码,以及自定义 CA 的组织信息,如国家/地区、州、组织、单位和发行者名称。
使用以下命令生成根证书:
openssl x509 -req -sha256 -days 365 -in <issuer-name>.csr -signkey <issuer-name>.key -out <issuer-name>.crt
这将用于签名你的服务器证书。
2.3 创建证书的密钥
注意:此服务器名称必须与发行者名称不同。
openssl ecparam -out <server-name>.key -name prime256v1 -genkey
2.4 创建 CSR(证书签名请求)
openssl req -new -sha256 -key <server-name>.key -out <server-name>.csr
注意:提示时,输入根密钥的密码,以及自定义 CA 的组织信息:国家/地区、州、组织、单位和完全限定域名。
这是服务器的域名,它应该与发行者不同。
2.5 使用 CSR、密钥和发行者的根密钥生成证书并签名
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 验证新创建的证书
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 工具提取所有的证书和密钥:
密钥
openssl pkcs12 -in testcert.pfx -nocerts -nodes -out garnet.key
证书
openssl pkcs12 -in testcert.pfx -clcerts -nokeys -out garnet-cert.crt
CA 证书
openssl pkcs12 -in testcert.pfx -cacerts -nokeys -chain -out garnet-ca.crt
密码保护会话
Garnet 支持使用 RESP 协议的 AUTH 机制保护密码会话。当你创建一个 Garnet 服务器时,你可以通过 --auth
标志指定启用认证,以及你想要启用的认证类型。以下是启用或禁用密码保护连接的选项:
- NoAuth,默认情况下没有密码要求。
GarnetServer --auth NoAuth
- Password,指示服务器客户端在发送请求之前应使用 auth 命令和密码。
启动服务器时包含密码:
GarnetServer --auth Password --password <passwordplaceholder>
通过这两个特性,你可以获得 Garnet 部署的基本安全能力。请与你的团队安全需求核对,这个功能是否足以满足你的需求。请注意,如果启用了大于内存的数据,我们不加密溢写到本地磁盘的数据,或者检查点。我们也不加密内存中实际服务的数据。