使用 Stunnel 做 Redis SSL认证

简介

Stunnel是一个自由的跨平台软件,用于提供全局的TLS/SSL服务。

针对本身无法进行TLS或SSL通信的客户端及服务器,Stunnel可提供加密安全连接。该软件可在许多操作系统下运行,包括类Unix系统,以及Windows。Stunnel依赖于某个独立的库,如OpenSSL或者SSLeay,以实现TLS或SSL协议。

Stunnel使用基于X.509数字证书的公开密钥加密算法来保证SSL的安全连接。客户端也可以选用自签名的数字证书来得到授权)。

使用

以下以 Redis 为例,其他基于 TCP 通信的程序理论上也可使用该方法实现 SSL认证。

服务端

安装 Redis

在服务端安装 Redis

  1. 安装 redis

    shell
    1
    yum -y install redis
  2. 启动 Redis

    shell
    1
    systemctl start redis && systemctl enable redis

安装 Stunnel

  1. 安装 Stunnel

    shell
    1
    yum -y install stunnel
  2. 创建证书

    shell
    1
    vim gencert-stunnel.sh

    写入如下内容

    gencert-stunnel.sh >folded
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/env bash

    read -p "Enter your domain [example.com]: " DOMAIN

    openssl genrsa -out /etc/stunnel/key.pem 2048

    openssl req -new -x509 -key /etc/stunnel/key.pem -out /etc/stunnel/cert.pem -days 365 -subj "/C=CN/ST=Beijing/L=Beijing/O=akiya/CN=${DOMAIN}"

    cat /etc/stunnel/key.pem /etc/stunnel/cert.pem > /etc/stunnel/private.pem

    chmod 640 /etc/stunnel/key.pem /etc/stunnel/cert.pem /etc/stunnel/private.pem

    保存退出后,赋予脚本可执行权限,并执行。按提示输入域名即可。

    shell
    1
    2
    chmod +x gencert-stunnel.sh
    ./gencert-stunnel.sh
  3. 创建配置文件

    shell
    1
    vim /etc/stunnel/stunnel.conf

    内容如下(以 Redis 为例):

    /etc/stunnel/stunnel.conf >folded
    1
    2
    3
    4
    5
    6
    7
    8
    cert = /etc/stunnel/private.pem
    pid = /var/run/stunnel.pid
    # 定义一个服务
    [redis]
    # 监听端口
    accept = 56379
    # 本地redis地址
    connect = 127.0.0.1:6379
  4. 创建 systemd 脚本

    1
    vim /usr/lib/systemd/system/stunnel.service

    内容如下:

    /usr/lib/systemd/system/stunnel.service >folded
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [Unit]
    Description=SSL tunnel
    After=syslog.target

    [Service]
    Type=forking
    ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf
    ExecStop=/usr/bin/kill -9 $(pgrep stunnel)
    ExecStatus=pgrep stunnel

    Restart=always

    [Install]
    WantedBy=multi-user.target

    保存退出后启动服务

    shell
    1
    2
    3
    systemctl daemon-reload
    systemctl start stunnel
    systemctl enable stunnel

客户端

安装 Stunnel

  1. 安装 Stunnel

    shell
    1
    yum -y install stunnel
  2. 从 redis 服务器上拷贝 /etc/stunnel/private.pem 到本地

    shell
    1
    scp root@stunnel-server:/etc/stunnel/private.pem /etc/stunnel/private.pem
  3. 创建配置文件

    shell
    1
    vim /etc/stunnel/stunnel.conf

    内容如下(以 Redis 为例):

    /etc/stunnel/stunnel.conf >folded
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cert = /etc/stunnel/private.pem
    # 客户端独有标识
    client = yes
    pid = /var/run/stunnel.pid
    [redis]
    # 本机监听的端口
    accept = 6379
    # 服务端的IP及端口
    connect = stunnel-server:56379
  4. 创建 systemd 脚本

    shell
    1
    vim /usr/lib/systemd/system/stunnel.service

    内容如下:

    /usr/lib/systemd/system/stunnel.service >folded
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [Unit]
    Description=SSL tunnel
    After=syslog.target

    [Service]
    Type=forking
    ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf
    ExecStop=/usr/bin/kill -9 $(pgrep stunnel)
    ExecStatus=pgrep stunnel

    Restart=always

    [Install]
    WantedBy=multi-user.target

    保存退出后启动服务

    shell
    1
    2
    3
    systemctl daemon-reload
    systemctl start stunnel
    systemctl enable stunnel

测试/使用

使用redis客户端连接 stunnel 客户端 IP:Port 测试。

shell
1
redis-cli -h stunnel-client -p 6379
评论

:D 一言句子获取中...

加载中,最新评论有1分钟缓存...