ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Garnet TLS 配置完全指南:证书生成、服务端启用与 RESP 客户端安全连接

2026/9/15 19:45:20 拓冰建站 浏览量
Garnet TLS 配置完全指南:证书生成、服务端启用与 RESP 客户端安全连接 Garnet TLS 配置完全指南证书生成、服务端启用与 RESP 客户端安全连接【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnetGarnet 是微软研究院推出的高性能远程缓存存储remote cache-store支持通过 TLS 对服务端与客户端之间的所有连接进行加密。本文以仓库中的 test/testcerts/README.md 为骨架系统讲解 Garnet 的 TLS 配置如何使用仓库自带的测试证书快速启动加密服务如何通过--cert-file-name加载 PFX 或 PEM 格式证书如何用 openssl 手工签发一套自签名证书以及如何让兼容 RESP 的客户端如 redis-cli携带证书安全接入。读完本文你将能够独立完成 Garnet 从证书准备、服务端 TLS 启动到客户端双向认证接入的完整链路。1. TLS 支持概览证书格式与自动检测在 Garnet 中启用 TLS 的核心入口是GarnetServer的两个命令行参数--cert-file-name与--cert-password。GarnetServer 既接受包含公私钥的 PFX 证书Windows/Linux 均可也接受 PEM 编码的证书与私钥对。证书格式是根据文件内容自动检测的而非依赖文件扩展名因此.pfx、.pem、.crt、.cer文件都可以通过--cert-file-name传入。该自动检测逻辑实现在 libs/server/TLS/CertificateUtils.cs 的GetMachineCertificateByFile与IsPemFile方法中IsPemFile读取文件开头的字节流检查是否以-----BEGIN标记开头容忍 UTF-8 BOM 与前面的空行/空白据此区分 PEM 与 PKCS#12/PFX检测为 PEM 后调用GetCertificateFromPemFile通过X509Certificate2.CreateFromPemFile加载证书与私钥再经 PKCS#12 重新导入以获得 SslStream 各平台都支持的持久化密钥集检测为非 PEM 则走X509CertificateLoader.LoadPkcs12FromFile.NET 9或new X509Certificate2(fileName, password)加载 PFX。在 libs/host/Configuration/Options.cs 中这两个参数的定义为--cert-file-name TLS 证书文件名。接受 PKCS#12/PFX 文件或 PEM 编码证书.pem/.crt/.cer 格式根据文件内容自动检测示例testcert.pfx --cert-password TLS 证书密码示例placeholder。当 cert-file-name 为 PEM 编码证书时 该参数被当作独立 PEM 私钥文件的路径若私钥已包含在证书文件中则可不传从源码与测试均能印证以内容而非扩展名判定格式这一点单元测试GetMachineCertificateByFileDetectsPemContentsRegardlessOfExtension见 test/standalone/Garnet.test/CertificateUtilsTests.cs将 PEM 证书复制为testcert.pfx文件名后仍能正确加载GetMachineCertificateByFileLoadsPemCertificateWithEmbeddedKey则验证了单个 PEM 文件同时包含证书与私钥时无需再指定私钥文件。2. 使用仓库自带的测试证书快速启动仓库在test/testcerts目录下提供了现成的测试证书文件便于开发与测试环境直接启用 TLS文件用途testcert.pfxPFX 格式证书含公私钥密码为placeholdertestcert.pemPEM 格式证书testcert.key.pemPEM 格式私钥garnet-cert.crt从 pfx 导出的客户端证书garnet.key从 pfx 导出的客户端私钥garnet-ca.crt从 pfx 导出的 CA 根证书2.1 以 PFX 证书启动服务端GarnetServer --cert-file-name /path/to/testcert.pfx --cert-password placeholder2.2 以 PEM 证书 独立私钥启动服务端GarnetServer --cert-file-name /path/to/testcert.pem --cert-password /path/to/testcert.key.pem此时--cert-password的位置传入的是私钥文件路径。也可以直接把证书与私钥合并进同一个 PEM 文件证书内容在前、私钥内容在后则无需再指定私钥文件。2.3 将 PEM 私钥/证书转换为 PFX若你只有分离的.key/.crtPEM 文件希望得到 PFX 格式可以使用 opensslopenssl pkcs12 -inkey server-name.key -in server-name.crt -export -out server-cert.pfx2.4 使用测试证书的注意点test/testcerts/README.md明确提示这些证书是自签名的默认不被系统信任它们可能使用了过时的哈希与加密套件强度有限生产环境应购买由知名证书颁发机构CA签发的证书仅供开发/测试环境使用。对应地测试代码中硬编码的证书口令即为placeholder见 test/standalone/Garnet.test/TestUtils.cs与 README 的说明一致。3. Garnet 的 TLS 配置参数全景除--cert-file-name/--cert-password之外libs/host/Configuration/Options.cs 还定义了以下 TLS 相关参数它们共同构成完整的 TLS 配置面参数说明默认/取值--tls是否启用 TLSfalse--cert-subject-name按主题名从 Windows 本机证书存储加载证书仅 Windows 支持与 cert-file-name 二选一空--cert-refresh-freq证书刷新频率秒0表示禁用自动刷新0--client-certificate-required服务端是否要求客户端提供有效证书双向认证/mTLSfalse--server-certificate-required服务端侧作为客户端如集群 gossip、主从复制时是否要求验证对端服务器证书false--cluster-tls-client-target-host集群模式下 TLS 连接的客户端目标主机名空--certificate-revocation-check-mode证书吊销检查模式NoCheck/Online/Offline--issuer-certificate-path用于校验的签发者CA证书文件完整路径为空则不执行对签发者的校验空这些参数在 libs/server/TLS/GarnetTlsOptions.cs 中被组织进SslServerAuthenticationOptions与SslClientAuthenticationOptions。值得注意的实现细节服务端证书选择通过ServerCertificateSelector完成首次同步加载证书若配置了--cert-refresh-freq则启动一个 Timer 周期刷新证书失败时按 5 秒重试实现证书热更新见 libs/server/TLS/ServerCertificateSelector.cscert-file-name与cert-subject-name同时设置会抛出GarnetException二者只能提供其一cert-subject-name仅在 Windows 平台可用当client-certificate-required开启但未提供issuer-certificate-path时代码会记录警告远端证书链将不做签发者校验ValidateCertificateIssuer中authority null时仅构建信任链不比对根证书指纹。4. 让 RESP 兼容客户端通过 TLS 接入要使用 RESP 兼容客户端例如 redis-cli通过 TLS 连接 Garnet客户端需要三样东西服务端证书、私钥、CA 根证书。以仓库导出的测试证书为例启动客户端时提供--cacert garnet-ca.crt --cert garnet-cert.crt --key garnet.key即redis-cli --tls \ --cacert /path/to/garnet-ca.crt \ --cert /path/to/garnet-cert.crt \ --key /path/to/garnet.key \ -h garnet-host -p garnet-port服务端侧对应需要开启--client-certificate-required并推荐指定--issuer-certificate-path指向 CA 根证书形成双向 TLS 认证。测试工程中的用法可作参考在 test/standalone/Garnet.test/TestUtils.cs 中测试客户端通过CertificateUtils.GetMachineCertificateByFile(certFile, certPassword)加载testcert.pfx并放入ClientCertificates集合发起 TLS 连接服务端同时配置了证书文件与ClientCertificateRequired true。5. 生成你自己的自签名证书openssl 全流程若不想使用仓库测试证书可按以下步骤用 openssl 构建一套根 CA → 服务器证书的完整证书链。整个过程会产生四个关键文件issuer-name.crt/.keyCA 根与server-name.crt/.key服务器证书。5.1 安装 opensslLinux 发行版sudo apt install opensslWindows 系统可从 OpenSSL 官方 Wiki 的 Binaries 页面选取合适的发行版安装说明详见 test/testcerts/README.md。5.2 创建根密钥CA 私钥openssl ecparam -out issuer-name.key -name prime256v1 -genkey这里使用prime256v1椭圆曲线生成根 CA 的私钥。5.3 生成根证书 CSR 并自签名首先生成证书签名请求CSRopenssl req -new -sha256 -key issuer-name.key -out issuer-name.csr按提示输入根密钥密码以及自定义 CA 的组织信息Country/Region国家/地区、State省/州、Org组织、OU部门和签发者名称。然后用根密钥自签名生成根证书openssl x509 -req -sha256 -days 365 -in issuer-name.csr -signkey issuer-name.key -out issuer-name.crt生成的issuer-name.crt将用于签署后续的服务器证书。5.4 创建服务器证书密钥注意服务器名称subject必须与签发者名称不同。openssl ecparam -out server-name.key -name prime256v1 -genkey5.5 生成服务器证书 CSRopenssl req -new -sha256 -key server-name.key -out server-name.csr按提示输入密码与组织信息其中通用名fully qualified domain name必须填写服务器的域名且与签发者不同——这个名称将与后续连接时的服务端主机名匹配是 TLS 校验的关键。5.6 用 CA 根证书签署服务器证书openssl x509 -req -in server-name.csr -CA issuer-name.crt -CAkey issuer-name.key -CAcreateserial -out server-name.crt -days 365 -sha256-CAcreateserial会生成序列号文件issuer-name.srl-days 365设置证书有效期一年。5.7 验证新证书openssl x509 -in server-name.crt -text -noout输出会展示证书的全部信息包括你录入的组织信息、Issuer签发者与Subject证书主体/服务器名数据可据此确认证书链正确。5.8 确认最终文件清单完成上述步骤后你的目录下应包含四个文件issuer-name.crt—— CA 根证书issuer-name.key—— CA 根私钥server-name.crt—— 服务器证书server-name.key—— 服务器私钥随后即可用第 2 节的方式将server-name.crtserver-name.key作为 PEM 对传入GarnetServer或以 2.3 节的 openssl 命令转换为 PFX 使用。6. 从 PFX 导出分离的证书/私钥/CA 文件当手头只有 PFX 格式证书例如仓库的testcert.pfx而客户端需要分离的证书、私钥与 CA 文件时可用 openssl 分别导出导出私钥-nocerts表示不含证书-nodes表示不加密私钥openssl pkcs12 -in testcert.pfx -nocerts -nodes -out garnet.key导出客户端证书-clcerts仅导出客户端证书-nokeys不含私钥openssl pkcs12 -in testcert.pfx -clcerts -nokeys -out garnet-cert.crt导出 CA 根证书-cacerts仅导出 CA 证书-chain包含证书链openssl pkcs12 -in testcert.pfx -cacerts -nokeys -chain -out garnet-ca.crt执行后即得到第 4 节客户端连接所需的garnet.key、garnet-cert.crt、garnet-ca.crt三件套。7. 常见问题与排障要点证书加载失败检查--cert-file-name路径与--cert-password是否正确。源码中ServerCertificateSelector在同步加载失败时会记录 Unable to fetch certificate using the provided filename and password 日志若配置了--cert-refresh-freq则会按 5 秒间隔自动重试见 libs/server/TLS/ServerCertificateSelector.cs。PEM 文件无法解析确认文件确实以-----BEGIN开头且未被编辑器写入额外内容CertificateUtils.IsPemFile已对 UTF-8 BOM 与前置空行做了容错对应测试GetMachineCertificateByFileDetectsPemWithLeadingBomAndBlankLines见 test/standalone/Garnet.test/CertificateUtilsTests.cs。主机名校验失败服务器证书 Subject 中的通用名FQDN必须与客户端连接使用的目标主机名一致客户端校验逻辑优先取 DNS 名称缺省时回退到 SimpleName 进行不区分大小写的比对见 libs/server/TLS/GarnetTlsOptions.cs。同时指定了 cert-file-name 与 cert-subject-name二者互斥运行时会抛出GarnetExceptioncert-subject-name还仅支持 Windows 平台。双向认证未生效确认服务端设置了--client-certificate-required true并通过--issuer-certificate-path指定 CA 根证书否则校验回调会直接放行源码中ClientCertificateRequired false时记录警告并恒返回 true。8. 总结Garnet 的 TLS 配置链路清晰完整服务端通过--cert-file-name/--cert-password加载 PFX 或 PEM 证书格式按内容自动识别配合--tls、双向认证与证书热更新等参数可覆盖从单机加密到集群复制的安全需求仓库test/testcerts目录提供了开箱即用的测试证书PFX 口令placeholderopenssl 全流程则可满足自定义证书链的生成与导出。将上述命令与配置组合起来即可快速搭建一套 TLS 加密的 Garnet 开发/测试环境并为生产环境的证书规划提供完整参考。【免费下载链接】garnetGarnet is a remote cache-store from Microsoft Research that offers strong performance (throughput and latency), scalability, storage, recovery, cluster sharding, key migration, and replication features. Garnet can work with existing Redis clients.项目地址: https://gitcode.com/GitHub_Trending/garnet4/garnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考