深入解析wmnnd/nginx-certbot项目中的init-letsencrypt.sh脚本
脚本概述
init-letsencrypt.sh是wmnnd/nginx-certbot项目中的核心自动化脚本,主要用于为Nginx容器配置Let's Encrypt SSL证书。这个脚本通过一系列精心设计的步骤,实现了从证书申请到Nginx配置的完整流程,极大简化了HTTPS证书的部署过程。
脚本功能详解
1. 环境检查
脚本首先检查docker-compose是否已安装:
if ! [ -x "$(command -v docker-compose)" ]; then
echo 'Error: docker-compose is not installed.' >&2
exit 1
fi
这一检查确保了脚本运行的基本环境要求,避免因缺少依赖而导致后续步骤失败。
2. 配置参数
脚本定义了几个关键配置变量:
domains=(example.org www.example.org) # 需要申请证书的域名
rsa_key_size=4096 # RSA密钥长度
data_path="./data/certbot" # 证书数据存储路径
email="" # 管理员邮箱(推荐填写)
staging=0 # 测试模式开关
这些参数可以根据实际需求进行修改,其中特别需要注意的是:
staging
参数在测试时应设为1,避免触发Let's Encrypt的请求限制- 填写有效的
email
有助于接收证书到期提醒
3. 证书数据目录处理
脚本会检查证书数据目录是否存在,并提示用户确认是否覆盖:
if [ -d "$data_path" ]; then
read -p "Existing data found for $domains. Continue and replace existing certificate? (y/N) " decision
if [ "$decision" != "Y" ] && [ "$decision" != "y" ]; then
exit
fi
fi
这种交互式设计避免了意外覆盖现有证书的风险。
4. TLS参数下载
脚本会自动下载推荐的TLS配置参数:
if [ ! -e "$data_path/conf/options-ssl-nginx.conf" ] || [ ! -e "$data_path/conf/ssl-dhparams.pem" ]; then
echo "### Downloading recommended TLS parameters ..."
mkdir -p "$data_path/conf"
curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot-nginx/certbot_nginx/_internal/tls_configs/options-ssl-nginx.conf > "$data_path/conf/options-ssl-nginx.conf"
curl -s https://raw.githubusercontent.com/certbot/certbot/master/certbot/certbot/ssl-dhparams.pem > "$data_path/conf/ssl-dhparams.pem"
echo
fi
这些参数包括:
options-ssl-nginx.conf
: Nginx的SSL优化配置ssl-dhparams.pem
: Diffie-Hellman参数文件
5. 临时证书创建
为了确保Nginx能正常启动以进行域名验证,脚本会先创建一个临时证书:
echo "### Creating dummy certificate for $domains ..."
path="/etc/letsencrypt/live/$domains"
mkdir -p "$data_path/conf/live/$domains"
docker-compose run --rm --entrypoint "\
openssl req -x509 -nodes -newkey rsa:$rsa_key_size -days 1\
-keyout '$path/privkey.pem' \
-out '$path/fullchain.pem' \
-subj '/CN=localhost'" certbot
echo
这个临时证书有效期为1天,仅用于初始化过程。
6. Nginx服务启动
echo "### Starting nginx ..."
docker-compose up --force-recreate -d nginx
echo
启动Nginx容器是为了让Let's Encrypt的验证请求能够通过HTTP访问到验证文件。
7. 临时证书清理
在正式申请证书前,脚本会清理之前创建的临时证书:
echo "### Deleting dummy certificate for $domains ..."
docker-compose run --rm --entrypoint "\
rm -Rf /etc/letsencrypt/live/$domains && \
rm -Rf /etc/letsencrypt/archive/$domains && \
rm -Rf /etc/letsencrypt/renewal/$domains.conf" certbot
echo
8. 正式证书申请
这是脚本的核心部分,使用certbot通过webroot插件申请证书:
docker-compose run --rm --entrypoint "\
certbot certonly --webroot -w /var/www/certbot \
$staging_arg \
$email_arg \
$domain_args \
--rsa-key-size $rsa_key_size \
--agree-tos \
--force-renewal" certbot
关键参数说明:
--webroot -w /var/www/certbot
: 使用webroot验证方式$staging_arg
: 测试模式参数(如果staging=1)$email_arg
: 邮箱参数$domain_args
: 要申请证书的所有域名--rsa-key-size 4096
: 使用4096位的RSA密钥--force-renewal
: 强制更新证书
9. Nginx配置重载
最后,脚本会重载Nginx配置使新证书生效:
echo "### Reloading nginx ..."
docker-compose exec nginx nginx -s reload
使用建议
-
测试环境验证:首次使用时,建议设置
staging=1
进行测试,确认无误后再切换到生产环境。 -
域名配置:务必修改
domains
数组为你的实际域名,支持多个域名和子域名。 -
邮箱设置:虽然邮箱是可选的,但建议填写有效的管理员邮箱,以便接收证书到期提醒。
-
证书续期:Let's Encrypt证书有效期为90天,建议设置cron任务定期执行续期操作。
-
安全考虑:生产环境中,应考虑增加证书的自动续期机制和监控。
技术原理
该脚本的实现基于以下几个关键技术点:
-
Docker容器编排:利用docker-compose管理Nginx和Certbot容器。
-
ACME协议:Let's Encrypt使用ACME协议自动化证书颁发过程。
-
Webroot验证:通过在网站根目录下放置验证文件来证明域名所有权。
-
临时证书:解决Nginx启动依赖证书的"鸡生蛋蛋生鸡"问题。
通过这个脚本,开发者可以快速为Nginx服务部署免费的Let's Encrypt证书,实现网站的HTTPS加密,提升安全性和用户信任度。