首页
/ 深入解析wmnnd/nginx-certbot项目中的init-letsencrypt.sh脚本

深入解析wmnnd/nginx-certbot项目中的init-letsencrypt.sh脚本

2025-07-10 02:05:38作者:庞眉杨Will

脚本概述

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

使用建议

  1. 测试环境验证:首次使用时,建议设置staging=1进行测试,确认无误后再切换到生产环境。

  2. 域名配置:务必修改domains数组为你的实际域名,支持多个域名和子域名。

  3. 邮箱设置:虽然邮箱是可选的,但建议填写有效的管理员邮箱,以便接收证书到期提醒。

  4. 证书续期:Let's Encrypt证书有效期为90天,建议设置cron任务定期执行续期操作。

  5. 安全考虑:生产环境中,应考虑增加证书的自动续期机制和监控。

技术原理

该脚本的实现基于以下几个关键技术点:

  1. Docker容器编排:利用docker-compose管理Nginx和Certbot容器。

  2. ACME协议:Let's Encrypt使用ACME协议自动化证书颁发过程。

  3. Webroot验证:通过在网站根目录下放置验证文件来证明域名所有权。

  4. 临时证书:解决Nginx启动依赖证书的"鸡生蛋蛋生鸡"问题。

通过这个脚本,开发者可以快速为Nginx服务部署免费的Let's Encrypt证书,实现网站的HTTPS加密,提升安全性和用户信任度。