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
相关产品推荐
相关产品推荐

