You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中Apache的TLS/SSL证书签发与配置问题(AWS环境)

为Docker部署的Apache配置TLS/SSL证书(基于AWS Route53)

针对你用Docker部署Apache、通过AWS CodeBuild/CodeDeploy发布,且需要用Route53域名签发HTTPS证书的场景,以下是完整的解决方案:

一、用Certbot + Route53插件自动签发证书

因为你用Route53托管域名,dns-01验证是最适合的方案——不需要开放80/443端口给ACME验证服务器,且能完全自动化完成证书签发与续签。

1. 配置EC2实例的IAM权限

给部署应用的EC2实例附加IAM角色,添加Route53操作权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "route53:ListHostedZones",
                "route53:ChangeResourceRecordSets"
            ],
            "Resource": "*"
        }
    ]
}

这个权限让Certbot能自动在Route53添加验证用的TXT记录,无需手动干预。

2. 在EC2主机安装Certbot及Route53插件

执行以下命令(针对Amazon Linux 2):

sudo yum install certbot python3-certbot-dns-route53 -y

3. 签发/续签证书

添加到部署钩子脚本中,实现自动化:

# 检查证书是否存在,不存在则签发,存在则续签
if [ ! -d "/etc/letsencrypt/live/your-domain.com" ]; then
    sudo certbot certonly --dns-route53 -d your-domain.com -d www.your-domain.com --non-interactive --agree-tos --email your-email@example.com
else
    sudo certbot renew --quiet --dns-route53
fi

二、修改Apache Docker配置以启用HTTPS

调整Dockerfile和Apache配置,启用SSL模块并关联证书:

修改后的Dockerfile

FROM httpd:2.4

# 启用SSL及缓存模块
RUN sed -i '/LoadModule ssl_module/s/^#//g' /usr/local/apache2/conf/httpd.conf
RUN sed -i '/LoadModule socache_shmcb_module/s/^#//g' /usr/local/apache2/conf/httpd.conf
# 引入SSL配置文件
RUN echo 'Include conf/extra/httpd-ssl.conf' >> /usr/local/apache2/conf/httpd.conf

# 复制自定义SSL虚拟主机配置
COPY ./conf/httpd-ssl.conf /usr/local/apache2/conf/extra/httpd-ssl.conf

# 复制静态资源
WORKDIR /usr/local/apache2/htdocs/
COPY dist/ /usr/local/apache2/htdocs/
RUN chmod -R 755 /usr/local/apache2/htdocs/

自定义SSL配置文件(conf/httpd-ssl.conf)

Listen 443

<VirtualHost *:443>
    ServerName your-domain.com
    ServerAlias www.your-domain.com

    SSLEngine on
    # 指向容器内挂载的证书路径(只读挂载主机的证书目录)
    SSLCertificateFile "/etc/letsencrypt/live/your-domain.com/fullchain.pem"
    SSLCertificateKeyFile "/etc/letsencrypt/live/your-domain.com/privkey.pem"

    DocumentRoot "/usr/local/apache2/htdocs"
    <Directory "/usr/local/apache2/htdocs">
        Options Indexes FollowSymLinks
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

# 可选:80端口重定向到HTTPS
<VirtualHost *:80>
    ServerName your-domain.com
    Redirect permanent / https://your-domain.com/
</VirtualHost>

三、更新部署启动脚本(start_server.sh)

修改容器启动命令,挂载主机证书目录并映射443端口:

#!/bin/bash

cd /janus-ui

# 清理现有容器
if sudo docker ps | grep -q acme-web; then
    sudo docker stop acme-web
fi

# 构建静态资源和镜像
npm run build
docker build -t acme-web-container .

# 启动容器:挂载证书目录(只读),映射80/443端口
sudo docker run -d --name acme-web -it --rm \
    -p 80:80 -p 443:443 \
    -v /etc/letsencrypt:/etc/letsencrypt:ro \
    acme-web-container

四、整合到CodeDeploy流程

把证书签发/续签的步骤加到scripts/before_install.sh中,确保部署前证书已准备好:

#!/bin/bash

# 安装Certbot(如果未安装)
if ! command -v certbot &> /dev/null; then
    sudo yum install certbot python3-certbot-dns-route53 -y
fi

# 处理证书
if [ ! -d "/etc/letsencrypt/live/your-domain.com" ]; then
    sudo certbot certonly --dns-route53 -d your-domain.com -d www.your-domain.com --non-interactive --agree-tos --email your-email@example.com
else
    sudo certbot renew --quiet --dns-route53
fi

后续维护

Certbot证书有效期为90天,添加cron job自动续签并重启容器:

# 编辑cron任务
sudo crontab -e
# 添加以下内容(每2个月1号凌晨执行)
0 0 1 */2 * sudo certbot renew --quiet --dns-route53 && sudo docker restart acme-web

内容的提问来源于stack exchange,提问作者Mateusz Janus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:21:06