Skip to content

在 Laravel 中配置 Redis TLS 证书:完整安全指南

介绍

Redis 是一个强大的内存数据结构存储,广泛用于 Laravel 应用程序中的缓存、会话存储和消息队列。默认情况下,Redis 连接是未加密的,这在传输敏感数据时会带来安全风险。使用签名证书实施 TLS(传输层安全)可确保 Laravel 应用程序和 Redis 服务器之间传输的所有数据都经过加密和保护。

本指南将带您完成在 Laravel 中使用 TLS 证书设置 Redis 的完整过程,包括证书处理、配置和生产环境的最佳实践。

先决条件

开始之前,请确保您拥有:

  • Laravel 应用程序(推荐版本 8.0 或更高)
  • 启用 TLS 支持的 Redis 服务器
  • 来自 Redis 提供商的 CA 证书文件
  • 访问 Laravel 项目配置文件的权限
  • 对 SSL/TLS 概念的基本理解

步骤 1:获取您的 Redis TLS 证书

首先,您需要从 Redis 提供商获取 CA 证书。这可能是:

  • 云提供商:AWS ElastiCache、Google Cloud Memorystore、Azure Cache for Redis
  • 托管 Redis 服务:Redis Cloud、Upstash 等
  • 自托管 Redis:您自己的 CA 证书

保存证书文件(通常具有 .crt.pem 扩展名)- 您将在后续步骤中需要它。

步骤 2:安全存储证书

在 Laravel 应用程序的存储文件夹中创建专用的证书目录:

bash
mkdir -p storage/app/certs

将您的 CA 证书复制到此目录:

bash
cp /path/to/your/ca-certificate.crt storage/app/certs/ca-certificate.crt

安全提示

如果证书文件包含敏感信息,请勿将其提交到版本控制系统。对于公共 CA 证书,这通常是安全的,但请始终与您的安全团队确认。

步骤 3:更新 .gitignore(可选)

如果您的证书包含敏感信息,请将它们添加到您的 .gitignore 文件中:

gitignore
# 证书文件(如果敏感)
storage/app/certs/*.key
storage/app/certs/*.p12
# 如果是公共 CA 证书,保持 .crt 文件被跟踪

步骤 4:配置环境变量

将以下 Redis TLS 配置变量添加到您的 .env 文件中:

bash
# Redis 配置
REDIS_HOST=your-redis-host.com
REDIS_USERNAME=your-username
REDIS_PASSWORD=your-password
REDIS_PORT=6380
REDIS_PREFIX=your_app_database_

# TLS 配置
REDIS_SCHEME=tls
REDIS_VERIFY_PEER=true
REDIS_VERIFY_PEER_NAME=true

更新您的 .env.example 文件以包含这些变量:

bash
# Redis
REDIS_HOST=127.0.0.1
REDIS_USERNAME=
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_PREFIX=localhost_database_
REDIS_SCHEME=tcp
REDIS_VERIFY_PEER=false
REDIS_VERIFY_PEER_NAME=false

步骤 5:更新 Redis 配置

修改您的 config/database.php 文件以包含 TLS 支持。更新 Redis 配置部分:

php
'redis' => [
    'client' => env('REDIS_CLIENT', 'phpredis'),

    'options' => [
        'cluster' => env('REDIS_CLUSTER', 'redis'),
        'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
        'scheme' => env('REDIS_SCHEME', 'tcp'),
        'ssl' => [
            'verify_peer' => env('REDIS_VERIFY_PEER', true),
            'verify_peer_name' => env('REDIS_VERIFY_PEER_NAME', true),
            'cafile' => storage_path('app/certs/ca-certificate.crt'),
        ],
    ],

    'default' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'username' => env('REDIS_USERNAME'),
        'password' => env('REDIS_PASSWORD'),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_DB', '0'),
    ],

    'cache' => [
        'url' => env('REDIS_URL'),
        'host' => env('REDIS_HOST', '127.0.0.1'),
        'username' => env('REDIS_USERNAME'),
        'password' => env('REDIS_PASSWORD'),
        'port' => env('REDIS_PORT', '6379'),
        'database' => env('REDIS_CACHE_DB', '1'),
    ],
],

步骤 6:测试连接

创建一个简单的测试来验证您的 Redis TLS 连接是否正常工作:

php
// 在控制器或 tinker 会话中
use Illuminate\Support\Facades\Redis;

try {
    Redis::set('test_key', '你好,安全的 Redis!');
    $value = Redis::get('test_key');

    if ($value === '你好,安全的 Redis!') {
        echo "✅ Redis TLS 连接成功!\n";
    }
} catch (Exception $e) {
    echo "❌ Redis 连接失败:" . $e->getMessage() . "\n";
}

使用 Laravel Tinker 运行此测试:

bash
php artisan tinker

然后执行上面的测试代码。

配置选项说明

SSL/TLS 选项

  • verify_peer:当为 true 时,根据 CA 证书验证对等方的证书
  • verify_peer_name:当为 true 时,验证对等方证书的通用名称是否与主机名匹配
  • cafile:用于验证的 CA 证书文件路径

环境变量

  • REDIS_SCHEME:设置为 tls 表示加密连接,tcp 表示未加密
  • REDIS_VERIFY_PEER:启用/禁用对等方证书验证
  • REDIS_VERIFY_PEER_NAME:启用/禁用主机名验证

常见问题故障排除

连接超时

可能原因

  • 防火墙阻止 TLS 端口
  • 端口配置不正确
  • 网络连接问题

解决方案:验证网络连接和端口配置。

安全最佳实践

  1. 在生产环境中始终使用 TLS
  2. 保持证书更新并监控到期日期
  3. 使用强验证设置verify_peer=trueverify_peer_name=true
  4. 限制证书文件权限仅允许 Web 服务器读取
  5. 定期审计您的 Redis 安全配置
  6. 使用专用的 Redis 用户具有最小所需权限

结论

在 Laravel 中为 Redis 连接实施 TLS 证书通过加密传输中的所有数据显著增强了应用程序的安全态势。虽然设置需要仔细的配置和证书管理,但安全好处使其对处理敏感数据的生产应用程序至关重要。

本指南中演示的配置方法提供了一个灵活的、环境感知的设置,可以适应不同的部署场景,同时保持安全最佳实践。定期监控和维护您的 TLS 设置将确保 Redis 连接的持续安全运行。

记住在部署到生产环境之前在暂存环境中彻底测试,并在部署期间出现连接问题时始终准备回滚计划。