删除与 Azure Cache for Redis 配合使用的 TLS 1.0 和 1.1

为了满足行业范围内对传输层安全性 (TLS) 1.2 或更高版本的独占使用,Azure Redis 缓存正朝着要求在 2025 年 4 月使用 TLS 1.2 的方向迈进。 TLS 版本 1.0 和 1.1 已知很容易遭到 BEAST 和 POODLE 之类的攻击,并且存在其他常见漏洞和披露 (CVE) 弱点。

TLS 版本 1.0 和 1.1 还不支持支付卡行业 (PCI) 符合性标准推荐的新式加密方法和密码套件。 此 TLS 安全性博客详细说明了其中一些漏洞。

重要

从 2025 年 4 月 1 日起,将强制实施 TLS 1.2 要求。

在这项工作的推进中,你可以期待 Azure Cache for Redis 出现如下变化:

  • 阶段 1:Azure Cache for Redis 不再将 TLS 1.0/1.1 作为新缓存创建的 MinimumTLSVersion 设置选项提供。 目前,不会更新现有的缓存实例。 不能将现有缓存的 MinimumTLSVersion 设置为 1.0 或 1.1。
  • 阶段 2:从 2025 年 4 月 1 日起,Azure Redis 缓存停止支持 TLS 1.1 和 TLS 1.0。 在此更改之后,应用程序必须使用 TLS 1.2 或更高版本才能与缓存通信。 当我们将所有缓存的 MinimumTLSVersion 更新为 1.2 时,Azure Cache for Redis 服务仍然可用。
日期 说明
2023 年 9 月 TLS 1.0/1.1 停用公告
2024 年 3 月 1 日 从 2024 年 3 月 1 日开始,将无法创建最低 TLS 版本设置为 1.0 或 1.1 的新缓存,也无法将现有缓存的 MinimumTLSVersion 设置为 1.0 或 1.1。 目前,现有缓存不会自动更新最低 TLS 版本。
2025 年 3 月 31 日 确保所有应用程序都使用 TLS 1.2 连接到 Azure Cache for Redis,并且缓存设置上的最低 TLS 版本设置为 1.2。
从 2025 年 4 月 1 日开始 所有缓存实例的最低 TLS 版本已更新为 1.2。 这意味着此时 Azure Cache for Redis 实例拒绝使用 TLS 1.0 或 1.1 连接。

作为此更改的一部分,Azure Cache for Redis 删除了对不安全的旧密码套件的支持。 如果为缓存配置最低的版本 TLS 1.2,则受支持的加密套件只有以下套件:

  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256

以下章节提供有关如何检测这些早期 TLS 版本的依赖项并将其从应用程序中删除的指导。

检查 Azure Redis 缓存支持的 TLS 版本

可以在 Azure 门户中缓存 高级设置中验证 最低 TLS 版本 值是否设置为 TLS 1.2。 如果它是任何 TLS 1.2 以外的值,则确保按照“配置 Azure Cache for Redis 以使用 TLS 1.2”部分中的说明进行操作。 如果值为 TLS 1.2,并且客户端应用程序能够在没有任何错误的情况下进行连接,则无需执行任何作。

还可以使用此 PowerShell 脚本来验证 Azure Redis 缓存终结点支持的最低 TLS 版本。 如果 Redis 实例已接入虚拟网络(VNet),则必须从能够访问 Azure Cache for Redis 终结点的 VNet 虚拟机上运行此脚本。 如果结果显示 Tls Enabled 和/或 Tls 11 Enabled,则确保按照“配置 Azure Cache for Redis 以使用 TLS 1.2”部分中的说明进行操作。 如果结果仅显示 Tls12 Enabled 并且客户端应用程序能够连接且没有任何错误,则无需执行任何作。

    param(
    [Parameter(Mandatory=$true)]
    [string]$redisCacheName,
    [Parameter(Mandatory=$false)]
    [string]$dnsSuffix = ".redis.cache.chinacloudapi.cn",
    [Parameter(Mandatory=$false)]
    [int]$connectionPort = 6380,
    [Parameter(Mandatory=$false)]
    [int]$timeoutMS = 2000
    )
    $redisEndpoint = "$redisCacheName$dnsSuffix"
    $protocols = @(
        [System.Security.Authentication.SslProtocols]::Tls,
        [System.Security.Authentication.SslProtocols]::Tls11,
        [System.Security.Authentication.SslProtocols]::Tls12
    )
    $protocols | % {
        $ver = $_
        $tcpClientSocket = New-Object Net.Sockets.TcpClient($redisEndpoint, $connectionPort )
        if(!$tcpClientSocket)
        {
            Write-Error "$ver- Error Opening Connection: $port on $computername Unreachable"
            exit 1;
        }
        else
        {
            $tcpstream = $tcpClientSocket.GetStream()
            $sslStream = New-Object System.Net.Security.SslStream($tcpstream,$false)
            $sslStream.ReadTimeout = $timeoutMS
            $sslStream.WriteTimeout = $timeoutMS
            try
            {
                $sslStream.AuthenticateAsClient($redisEndpoint, $null, $ver, $false)
                Write-Host "$ver Enabled"
            }
            catch [System.IO.IOException]
            {
                $null = $_
                #Write-Host "$ver Disabled"
            }
            catch
            {
                $null = $_
                #Write-Error "Unexpected exception $_"
            }
        }
    }

将 Azure Redis 缓存配置为使用 TLS 1.2

可以在缓存上配置 TLS 1.2,方法是将 最低 TLS 版本 值设置为 Azure 门户中缓存 高级设置中的 TLS 1.2。

  1. 若要将缓存配置为使用 TLS 1.2,请首先从缓存的资源菜单中选择 高级设置

  2. 在工作窗格中的 最低 TLS 版本 里,选择 1.2。 然后选择 “保存”

也可以使用 PowerShell 执行相同的操作。 运行命令之前,需要已安装 Az.RedisCache 模块。

   Set-AzRedisCache -Name <YourRedisCacheName> -MinimumTlsVersion "1.2"

若要通过 CLI 设置 TLS 版本,--minimum-tls-version 仅在 Redis 创建时可用,不支持更改现有 Redis 实例上的 minimum-tls-version

备注

迁移到 TLS 1.2 或更高版本期间,应提供 Azure Redis 缓存服务。

检查客户端应用程序是否已合规

可以通过将 最低 TLS 版本 值设置为 TLS 1.2,了解应用程序是否适用于 TLS 1.2,如前所述,在测试缓存或暂存缓存中运行测试。 如果应用程序在此更改后继续按预期运行,则可能符合要求。 你可能需要配置应用程序使用的 Redis 客户端库,以专门使 TLS 1.2 能够连接到 Azure Cache for Redis。

将客户端应用程序配置为使用 TLS 1.2

大多数应用程序使用 Redis 客户端库来处理与缓存的通信。 下面介绍了如何使用 TLS 1.2 配置各种编程语言和框架中的一些常用客户端库。

.NET

在 .NET Framework 4.5.2 或更低版本上,Redis .NET 客户端默认使用最低的 TLS 版本;在 .NET Framework 4.6 或更高版本上,则使用最新的 TLS 版本。 如果使用的是较旧版本的 .NET Framework,请手动启用 TLS 1.2:

  • StackExchange.Redis: 在连接字符串中设置 ssl=truesslProtocols=tls12
  • ServiceStack.Redis: 请按照 ServiceStack.Redis 说明操作,并至少需要 ServiceStack.Redis v5.6。

.NET Core

Redis .NET Core 客户端默认为 OS 默认 TLS 版本,此版本取决于 OS 本身。

根据 OS 版本和已应用的任何修补程序,有效的默认 TLS 版本可能会有所不同。 有关详细信息,请参阅 .NET Framework 中的传输层安全性 (TLS) 最佳做法

但是,如果使用的是旧版 OS,或者只是想要确定,我们建议通过客户端手动配置首选 TLS 版本。

Java

Redis Java 客户端基于 Java 版本 6 或更早版本使用 TLS 1.0。 如果在缓存中禁用了 TLS 1.0,则 Jedis、Lettuce 和 Redisson 无法连接到 Azure Cache for Redis。 升级 Java 框架以使用新的 TLS 版本。

对于 Java 7,Redis 客户端默认不使用 TLS 1.2,但可以配置为使用此版本。 例如,Jedis 允许你使用以下代码片段指定基础 TLS 设置:

SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLParameters sslParameters = new SSLParameters();
sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
sslParameters.setProtocols(new String[]{"TLSv1.2"});
 
URI uri = URI.create("rediss://host:port");
JedisShardInfo shardInfo = new JedisShardInfo(uri, sslSocketFactory, sslParameters, null);
 
shardInfo.setPassword("cachePassword");
 
Jedis jedis = new Jedis(shardInfo);

Lettuce 和 Redisson 客户端尚不支持指定 TLS 版本。 如果缓存仅接受 TLS 1.2 连接,它们会中断。 我们正在审查这些客户端的修补程序,因此请检查那些包是否有包含此支持的更新版本。

在 Java 8 中,默认情况下会使用 TLS 1.2,并且在大多数情况下都不需要更新客户端配置。 为了安全起见,请测试你的应用程序。

从 Java 17 起,默认使用 TLS 1.3。

Node.js

Node Redis 和 ioredis 都支持 TLS 1.2 和 1.3。

PHP

低于 PHP 7 的版本:Predis 仅支持 TLS 1.0。 这些版本不支持 TLS 1.2;必须升级才能使用 TLS 1.2。

PHP 7.0 到 PHP 7.2.1:默认情况下,Predis 仅使用 TLS 1.0 或 TLS 1.1。 可以通过以下变通办法来使用 TLS 1.2。 在创建客户端实例时指定 TLS 1.2:

$redis=newPredis\Client([
    'scheme'=>'tls',
    'host'=>'host',
    'port'=>6380,
    'password'=>'password',
    'ssl'=>[
        'crypto_type'=>STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT,
    ],
]);

PHP 7.3 及更高版本:Predis 使用最新的 TLS 版本。

PhpRedis

PhpRedis 在任何 PHP 版本上均不支持 TLS。

Python

Redis-py 默认使用 TLS 1.2。

GO

Redigo 默认使用 TLS 1.2。