ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

StackExchange.Redis 认证完全指南:从匿名连接、TLS、ACL 用户名密码到客户端证书

StackExchange.Redis 认证完全指南:从匿名连接、TLS、ACL 用户名密码到客户端证书 后端缓存数据库客户端消息队列【免费下载链接】StackExchange.RedisThe Redis client for .NET项目地址https://gitcode.com/gh_mirrors/st/StackExchange.Redis点击查看免费下载导读本文以 StackExchange.Redis 官方认证文档为主线系统梳理 .NET Redis 客户端连接 Redis 服务端的全部认证路径从最简单的default用户匿名连接到启用 TLS 加密、配置user/password账户凭据再到面向 Azure Managed Redis 的 Microsoft Entra ID 托管身份认证最后深入 8.6 版本支持的客户端证书即用户身份方案。读完本文你将能根据不同的安全等级要求为本地开发、生产 TLS 和云托管 Redis 分别选择并落地正确的认证配置并理解每个配置项在 ConfigurationOptions 源码层面对握手流程的具体影响。认证模型总览从最简到最复杂Redis 的访问控制基于 ACLAccess Control List用户体系。StackExchange.Redis 支持由简到繁的多种认证模型对应关系如下安全等级认证模型所需配置最简不安全default用户、无认证、明文传输仅指定端点地址传输加密default用户 TLSssltrue必要时配合TrustIssuer或CertificateValidation账户凭据ACL 用户 密码user、password配置项TLS 可选云托管身份Azure Managed Redis Microsoft Entra IDMicrosoft.Azure.StackExchangeRedis扩展包 ConfigureForAzureWithUserAssignedManagedIdentityAsync双向 TLS客户端证书SetUserPemCertificate/SetUserPfxCertificate/CertificateSelection证书即身份8.6TLS 客户端证书映射为 ACL 用户客户端证书 ACL用户 TrustIssuer最简也最不安全的连接方式使用default用户、无认证、无传输加密。这种方式通常只适合本地临时服务var muxer await ConnectionMultiplexer.ConnectAsync(myserver); // 或 myserver:1241 指定自定义端口从源码看认证凭据通过ConfigurationOptions的User与Password属性承载ConfigurationOptions.cs而连接字符串中的user、password、ssl等关键字由配置解析器识别ConfigurationOptions.cs最终在物理连接握手阶段以AUTH命令提交给服务端。TLS加密传输通道如果你的服务端已开启 TLS客户端需要显式告知 SE.Redis 使用加密连接。部分场景如 Azure Managed Redis下库会自动识别端点地址并启用相应特性无需你做任何配置——这一识别逻辑位于 AzureManagedRedisOptionsProvider它通过匹配.redis.azure.net、.redis.chinacloudapi.cn、.redis.usgovcloudapi.net、.redis.sovcloud-api.de、.redis.sovcloud-api.fr、.redisenterprise.cache.azure.net等域名后缀来判定 Azure Managed Redis 端点。手动启用 TLS 时使用ssl关键字var muxer await ConnectionMultiplexer.ConnectAsync(myserver,ssltrue);如果服务端证书已被本地机器信任以上即可正常工作。若服务端使用的是自签名或私有 CA 签发的证书则需要借助ConfigurationOptions告诉库信任该证书var options ConfigurationOptions.Parse(myserver,ssltrue); // 或var options new ConfigurationOptions { Endpoints { myserver }, Ssl true }; // TODO 按需配置 var muxer await ConnectionMultiplexer.ConnectAsync(options);信任本地签发 CATrustIssuer如果你持有本地签发方issuer的公钥证书常见为ca.crt可以直接调用options.TrustIssuer(caPath);其底层实现ConfigurationOptions.cs会生成一个RemoteCertificateValidationCallback当系统校验结果为证书链错误SslPolicyErrors.RemoteCertificateChainErrors时用传入的 issuer 证书重建证书链并验证服务器证书确实由该 CA 签发若系统校验本身已通过SslPolicyErrors.None则直接放行。验证链时还强制检查服务器 TLS 证书的增强型密钥用法_serverAuthOid即 OID1.3.6.1.5.5.7.3.1避免被错误类型的证书冒名顶替。自定义校验CertificateValidation高级场景下你可以提供完全自定义的服务端证书校验逻辑使用标准的RemoteCertificateValidationCallbackAPIoptions.CertificateValidation (sender, certificate, chain, sslPolicyErrors) { // 自定义校验逻辑返回 true/false return sslPolicyErrors SslPolicyErrors.None; };该回调在连接握手时通过 TlsOptions 注入到 TLS 客户端认证选项中。注意使用TrustIssuer本质上是给CertificateValidationCallback赋值一个预设实现二者互斥覆盖不可同时生效。用户名与密码ACL 凭据用户名和密码分别通过user与password关键字指定var muxer await ConnectionMultiplexer.ConnectAsync(myserver,ssltrue,usermyuser,passwordmypassword);未提供user时默认使用default用户某些场景下认证令牌token可替代传统密码直接用于password字段对应属性为ConfigurationOptions.User与ConfigurationOptions.PasswordConfigurationOptions.cs。面向 Sentinel 的独立凭据值得补充的是配置体系还提供了sentinelUser与sentinelPassword两个独立关键字源码常量见 ConfigurationOptions.cs属性定义见 ConfigurationOptions.cs当与 Sentinel 节点通信所需的账号与 Redis 主服务不同时可单独指定未指定时则回退复用User/Password。这在 Sentinel 高可用拓扑下很实用。Azure Managed RedisMicrosoft Entra ID 托管身份认证当服务端是 Azure Managed Redis 资源时可使用 Microsoft Entra ID原 Azure AD认证来保障连接安全。具体做法是引入Microsoft.Azure.StackExchangeRedis扩展包它通过ConfigurationOptions类集成从 Microsoft Entra 检索令牌完成认证且支持多种身份类型。以用户分配的托管身份user-assigned managed identity为例var options ConfigurationOptions.Parse(mycache.region.redis.azure.net:10000); await options.ConfigureForAzureWithUserAssignedManagedIdentityAsync(managedIdentityClientId);其余身份类型系统分配托管身份、服务主体、交互式登录等及完整示例请查阅Microsoft.Azure.StackExchangeRedis扩展包的官方文档与示例。结合前面提到的 AzureManagedRedisOptionsProvider 可知该库对 Azure 域名的自动识别同时会应用 Azure 相关默认值——例如AbortOnConnectFail默认关闭、DefaultVersion直接取 Redis 7.4 特性集——从而在云环境中获得更合适的连接行为。客户端证书双向 TLS若服务端要求客户端提供证书SE.Redis 支持多种供证方式。PEM 证书对公钥 私钥持有本地公钥/私钥对如MyUser2.crt与MyUser2.key时使用SetUserPemCertificateoptions.SetUserPemCertificate( userCertificatePath: userCrtPath, userKeyPath: userKeyPath );PFX 证书文件持有包含公私钥对的单个pfx文件时使用SetUserPfxCertificateoptions.SetUserPfxCertificate( userCertificatePath: userCrtPath, password: filePassword // 可选 );从实现看ConfigurationOptions.cs两个方法都会在设置证书选择回调的同时自动把Ssl置为 true源码注释与Ssl true赋值可见因此无需再手动指定ssltrue。CreatePemUserCertificateCallback内部还会先把 PEM 证书对导出为 PFX 格式再加载以规避部分平台对临时证书ephemeral certificate握手支持不完整而引发的运行时错误PFX 版本则直接通过X509Certificate2加载并支持可选文件密码。自定义证书选择CertificateSelection高级场景下可提供完全自定义的客户端证书查找逻辑使用标准的LocalCertificateSelectionCallbackAPIoptions.CertificateSelection (sender, targetHost, localCertificates, remoteCertificate, acceptableIssuers) { // 从证书存储、硬件密钥等来源挑选合适的客户端证书 return selectedCertificate; };该回调经由 TlsOptions 注入 TLS 握手。注意SetUserPemCertificate/SetUserPfxCertificate与CertificateSelection同为证书选择机制二者互斥后者优先覆盖前者。用户证书与隐式用户认证8.6历史上客户端证书只负责证明你被允许访问服务器连接后身份仍是default用户。从 Redis 8.6 开始服务端可以将客户端证书映射为用户身份从而取代密码的使用。该方案需要同时满足一个8.6 的服务端配置为使用 TLS 并启用客户端证书映射——通常以证书的CNCommon Name字段作为用户名服务端存在匹配的、已启用on的 ACL 用户账号——即执行ACL LIST应显示类似user MyUser2 on sanitize-payload ~* * all的行具体权限细节随用户授权而异客户端持有对应的客户端证书密钥对。完整示例string certRoot // 存放 ca.crt、MyUser2.crt 和 MyUser2.key 的文件夹路径 var options ConfigurationOptions.Parse(myserver:6380); options.SetUserPemCertificate(// 会自动启用 TLS userCertificatePath: Path.Combine(certRoot, MyUser2.crt), userKeyPath: Path.Combine(certRoot, MyUser2.key)); options.TrustIssuer(Path.Combine(certRoot, ca.crt)); await using var conn await ConnectionMultiplexer.ConnectAsync(options); // 验证我们确实以 MyUser2 身份连接 var user (string?)await conn.GetDatabase().ExecuteAsync(acl, whoami); Console.WriteLine(user); // 输出 MyUser2该模式的关键在于两条链路的协同服务端信任客户端证书TrustIssuer(ca.crt)让本地 CA 签发的客户端证书通过服务器验证信任链校验逻辑见 ConfigurationOptions.cs服务端将证书身份映射为 ACL 用户SetUserPemCertificate提交证书服务端依据CN识别出MyUser2此后客户端无需再发送任何密码直接以该用户身份执行命令。验证环节用ACL WHOAMI命令回读当前身份是确认证书即身份映射是否生效的最直接手段。实践建议与注意事项按环境分档配置本地开发可用匿名连接任何暴露到网络的服务端都应至少启用 TLS生产环境优先使用 ACL 账号密码或证书认证。证书信任最小化TrustIssuer只解决证书链错误这一种校验失败RemoteCertificateChainErrors其他校验错误如主机名不匹配、证书过期不会因信任 issuer 而放行——这正是 TrustIssuerCallback 中先检查sslPolicyError SslPolicyErrors.None、再检查 SslPolicyErrors.RemoteCertificateChainErrors的原因。回调互斥关系TrustIssuer与CertificateValidation共享同一个回调槽位SetUserPem/PfxCertificate与CertificateSelection同理后赋值者覆盖前者组合使用时需留意。证书即身份的限制需要 8.6 服务端支持客户端证书映射且服务端必须正确配置 ACL 用户与证书CN的对应关系版本不足时该特性不可用只能退化为证书仅用于访问、身份仍为default。云环境自动化Azure Managed Redis 端点的 TLS 与版本等默认值由 AzureManagedRedisOptionsProvider 自动适配配合Microsoft.Azure.StackExchangeRedis的 Entra ID 认证可做到几乎零手工配置。延伸阅读仓库文档Configuration连接字符串与配置项全集、Authentication本文档原文源码定位ConfigurationOptions.cs全部认证相关属性与回调、TlsOptions.csTLS 回调注入、AzureManagedRedisOptionsProvider.csAzure 端点识别Redis 官方的安全、ACL 与 TLS 文档提供了服务端侧的配套配置细节ACL 用户定义、客户端证书映射、加密配置可作为本文客户端侧方案的服务端对照。赞分享后端缓存数据库客户端消息队列【免费下载链接】StackExchange.RedisThe Redis client for .NET项目地址https://gitcode.com/gh_mirrors/st/StackExchange.Redis点击查看免费下载相关推荐Apache RocketMQ TLS 配置完全指南从证书生成到客户端双向认证Apache RocketMQ TLS 配置完全指南从证书生成到客户端双向认证 本篇指南基于 Apache RocketMQ 仓库中的 docs/cn/Con消息队列流处理后端Apache Pulsar 基于 TLS 的认证配置指南从客户端证书签发到多语言客户端接入Apache Pulsar 基于 TLS 的认证配置指南从客户端证书签发到多语言客户端接入 导读 TLS 认证TLS Authentication是 Ap消息队列后端流处理Python调用Guanaco-65B-GPTQ实战教程TransformersAutoGPTQ完整代码指南Python调用Guanaco 65B GPTQ实战教程TransformersAutoGPTQ完整代码指南 guanaco 65B GPTQ 是 Tim上一篇终极风扇控制指南5分钟学会用FanControl精准调节Windows电脑风扇下一篇Poco::MongoDB 副本集Replica Set支持完整指南SDAM 拓扑发现、故障转移与连接池实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表