如何在C# .NET中通过SSL连接Heroku Redis(StackExchange.Redis)?
Heroku Redis商业层级加密连接问题解决
问题背景
原本用于Heroku Redis免费层级的无加密连接代码可正常运行:
var redisUrlString = Environment.GetEnvironmentVariable("REDIS_URL"); var redisUri = new Uri(redisUrlString); var userInfo = redisUri.UserInfo.Split(':'); var redisConnString = $"{redisUri.Host}:{redisUri.Port},password={userInfo[1]}"; var redisConn = StackExchange.Redis.ConnectionMultiplexer.Connect(redisConnString); var redisDb = redisConn.GetDatabase(); redisDb.StringGet("test");
升级至商业层级后,因强制要求加密连接,原代码出现超时,Heroku日志报错:
app[redis-asymmetrical]: Error accepting a client connection: error:1408F10B:SSL routines:ssl3_get_record:wrong version number
添加ssl=true后仍无法连接,日志报错变为:
app[redis-asymmetrical]: Error accepting a client connection: (null)
缺失的关键配置
问题出在未指定正确的TLS版本。Heroku商业版Redis要求使用TLS 1.2或更高版本,StackExchange.Redis默认未启用符合要求的TLS版本,导致SSL握手失败。
修正后的代码
方法1:手动构建配置项
var redisUrlString = Environment.GetEnvironmentVariable("REDIS_URL"); var redisUri = new Uri(redisUrlString); var userInfo = redisUri.UserInfo.Split(':'); var config = new ConfigurationOptions { EndPoints = { $"{redisUri.Host}:{redisUri.Port}" }, Password = userInfo[1], Ssl = true, // 指定适配Heroku要求的TLS版本 SslProtocols = System.Security.Authentication.SslProtocols.Tls12 }; var redisConn = StackExchange.Redis.ConnectionMultiplexer.Connect(config); var redisDb = redisConn.GetDatabase(); redisDb.StringGet("test");
方法2:直接解析Redis URL(更简洁)
无需手动拆分URL,通过ConfigurationOptions.Parse处理后补充SSL配置:
var redisUrlString = Environment.GetEnvironmentVariable("REDIS_URL"); var config = ConfigurationOptions.Parse(redisUrlString); // 启用SSL并指定TLS版本 config.Ssl = true; config.SslProtocols = System.Security.Authentication.SslProtocols.Tls12; var redisConn = StackExchange.Redis.ConnectionMultiplexer.Connect(config); var redisDb = redisConn.GetDatabase(); redisDb.StringGet("test");
说明
- Heroku商业Redis仅支持TLS 1.2及以上版本,必须显式指定
SslProtocols参数; - 使用
ConfigurationOptions比手动拼接连接字符串更可靠,能避免URL拆分时的潜在错误。
内容的提问来源于stack exchange,提问作者adamsfamily
相关产品推荐
相关产品推荐

