【问题标题】:How to set up a Docker redis container with ssl如何使用 ssl 设置 Docker redis 容器
【发布时间】:2020-05-31 19:56:44
【问题描述】:

我正在关注this 教程。

就我而言,我在 Docker 环境中运行,并且我有一个安全站点(即https://localhost)。这需要安全的 ssl 通信。

我调整了 webcelery 容器以实现安全连接。
但我不知道如何配置 Redis 容器以实现与 ssl 的安全连接
请注意,当我在 webcelery 容器中不使用 ssl 连接运行时,连接正常。

如何使用 ssl 配置和运行 redis?

谢谢


编辑:

我按照 this 教程使用 ssl 设置 redis 和 this 教程通过 Docker 容器中的 stunnel 使用 ssl 设置 redis。

我成功地测试了从本地主机到 redis docker 容器的连接,方法是使用来自本地主机的以下调用从本地主机(通过 stunnel)调用 redis-cli 到 redis docker 容器:

redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> auth foobared
OK
127.0.0.1:6381> 

redis服务器Docker端的相关文件:

docker-compose 文件(我的 webapp 包含多个服务,但为了简单起见,我删除了除 redis 容器之外的所有服务):

version: '3'

services:
  redis:
    build:
      context: ./redis
      dockerfile: Dockerfile
    restart: always
    command: sh -c "stunnel /stunnel_take2.conf && /usr/local/bin/redis-server /etc/redis/redis.conf"
    expose:
      - '6379'
    ports:
     - "6379:6379"
    volumes:
      - /home/avner/avner/certs:/etc/certs
      - /home/avner/avner/redis/conf:/etc/redis

redis 容器 Dockerfile

FROM redis:5-alpine

RUN apk add --no-cache \
    stunnel~=5.56 \
    python3~=3.8

COPY stunnel-redis-server.conf /

WORKDIR /

ENV PYTHONUNBUFFERED=1

redis 服务器 redis 配置文件 - redis/conf/redis.conf

...
requirepass foobared
...

redis 服务器 stunnel 配置文件 - redis/stunnel-redis-server.conf

cert = /etc/certs/private.pem
pid = /var/run/stunnel.pid

[redis]
accept = 172.19.0.2:6380
connect = 127.0.0.1:6379

客户端(本地主机)的相关文件:

redis 客户端 stunnel 配置文件 - /etc/stunnel/redis-client.conf

cert = /etc/cert/private.pem
client = yes
pid = /var/run/stunnel.pid
[redis]
accept = 127.0.0.1:6381
connect = 172.19.0.2:6380

【问题讨论】:

    标签: docker redis celery


    【解决方案1】:

    我创建了一个示例 repo,说明如何设置 docker 容器以使用新的 redis v6+ ssl:

    docker-compose.yml

    version: "3"
    
    volumes:
      redis:
    
    services:
      redis:
        image: "example/redis:v6.0.13"
        command: ["/app/docker-redis-entrypoint.sh"]
        container_name: redis
        ports:
          - 6379:6379
        volumes:
          - redis:/data
          - ./:/app
    

    Dockerfile:

    FROM redis:6.0.13 as base
    COPY ./redis/tls /tls
    

    入口点.sh

    
    #!/bin/sh
    set -e
    
    redis-server --tls-port 6379 --port 0 \
        --tls-cert-file /tls/redis.crt \
        --tls-key-file /tls/redis.key \
        --tls-ca-cert-file /tls/ca.crt
    

    gen-redi-certs.sh

    
    #!/bin/bash
    
    # COPIED/MODIFIED from the redis server gen-certs util
    
    # Generate some test certificates which are used by the regression test suite:
    #
    #   tls/ca.{crt,key}          Self signed CA certificate.
    #   tls/redis.{crt,key}       A certificate with no key usage/policy restrictions.
    #   tls/client.{crt,key}      A certificate restricted for SSL client usage.
    #   tls/server.{crt,key}      A certificate restricted for SSL server usage.
    #   tls/redis.dh              DH Params file.
    
    generate_cert() {
        local name=$1
        local cn="$2"
        local opts="$3"
    
        local keyfile=tls/${name}.key
        local certfile=tls/${name}.crt
    
        [ -f $keyfile ] || openssl genrsa -out $keyfile 2048
        openssl req \
            -new -sha256 \
            -subj "/O=Redis Test/CN=$cn" \
            -key $keyfile | \
            openssl x509 \
                -req -sha256 \
                -CA tls/ca.crt \
                -CAkey tls/ca.key \
                -CAserial tls/ca.txt \
                -CAcreateserial \
                -days 365 \
                $opts \
                -out $certfile
    }
    
    mkdir -p tls
    [ -f tls/ca.key ] || openssl genrsa -out tls/ca.key 4096
    openssl req \
        -x509 -new -nodes -sha256 \
        -key tls/ca.key \
        -days 3650 \
        -subj '/O=Redis Test/CN=Certificate Authority' \
        -out tls/ca.crt
    
    cat > tls/openssl.cnf <<_END_
    [ server_cert ]
    keyUsage = digitalSignature, keyEncipherment
    nsCertType = server
    [ client_cert ]
    keyUsage = digitalSignature, keyEncipherment
    nsCertType = client
    _END_
    
    generate_cert server "Server-only" "-extfile tls/openssl.cnf -extensions server_cert"
    generate_cert client "Client-only" "-extfile tls/openssl.cnf -extensions client_cert"
    generate_cert redis "Generic-cert"
    
    [ -f tls/redis.dh ] || openssl dhparam -out tls/redis.dh 2048
    

    【讨论】:

      【解决方案2】:

      Redis 本身不提供 SSL,你必须自己做。有一个关于它的in-depth post,您可以阅读和关注它。或者,如果您想使用 Dockerized 解决方案,您可以使用现成的镜像,例如 this onethis one。在设置 Celery 以通过 SSL 与 Redis 一起使用时,只需关注 documentation

      【讨论】:

      • 感谢@Tomas 我按照您建议的链接进行操作,并能够使用 ssl Docker 容器创建 redis。我在上面编辑了我的步骤。
      • Redis 6.0 comes with SSL。还不知道如何在 docker 中使用它。可能将您的证书数据挂载到容器中。
      猜你喜欢
      • 2021-04-07
      • 2013-08-07
      • 2021-10-08
      • 2017-09-06
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多