Administrator
发布于 2025-09-08 / 22 阅读
0
0

免费的nginx证书-Let's Encrypt

该机构的官方客户端工具是certbot,但是这个工具依赖于python3-certbot-nginx插件和python环境,试了一次爆出了底层接口不兼容的问题,所以使用更简单的方法:acme.sh,而acme.sh 默认使用 ZeroSSL而非Let's Encrypt,使用时需要手动指定,详见下列文章,Let's Encrypt完全免费,而ZeroSSL分免费版和付费版

1,下载脚本

curl https://get.acme.sh | sh -s email=自己的邮箱 --insecure    #这里的邮箱是注册ca  --insecure跳过校验ssl证书,可以不加

需要重新打开一个终端,acme.sh --version验证下是否成功,有结果即是成功

2,配置ng

listen 80;  # 关键:必须明确监听80端口,若缺少 listen 80;,Nginx 不会监听 80 端口,ACME 的 HTTP-01 验证请求(从 Let's Encrypt 服务器发往你的 80 端口)会直接被拒绝,导致证书申请失败,如果有防火墙,防火墙的80端口也需要放通
server_name www.huangcy.top;  # 与证书域名一致

3,申请证书

使用webroot模块(首选,不会有严格的验证流程):

#创建一个目录,这个目录下会存放验证文件,,目录是自定义的
mkdir -p /usr/local/nginx/html/.well-known/acme-challenge

nginx80端口下药加一个验证location:
location ^~ /.well-known/acme-challenge/ {
    root /usr/local/nginx/html;
    allow all;
    default_type "text/plain";
    # 可选:关闭日志,减少干扰
    access_log off;
    log_not_found off;
}
#注意,这个location只需要在每个域名的80端口配置即可,同一域名不需要重复配置,不管有多少server
# 可选:将80端口请求强制跳转HTTPS(需要在申请完证书后配置)
  # location / {
  #     return 301 https://$host$request_uri;
  # }

申请操作  
acme.sh --issue \
  -d www.huangcy.top \
  --webroot /usr/local/nginx/html \
  --server letsencrypt  #使用Let's Encrypt,不指定默认使用ZeroSSL

使用nginx模块:

acme.sh --issue \
  -d www.huangcy.top \  # 你的域名
  --nginx \  # 仅用 --nginx 模式,不添加任何路径参数
  --email ********@163.com 
  --server letsencrypt

#这里会有一个问题,acme.sh默认会去/etc/nginx下拉取配置,而且你的配置必须是严格按照标准结构conf.d/sites-enabled/等,所以我用的webroot

4,正确生成后,可以选择指定位置安装证书文件,并设置钩子,到期后会自动续期并重新加载

使用默认路径:
acme.sh --install-cert -d www.huangcy.top \
  --key-file /root/.acme.sh/www.huangcy.top_ecc/www.huangcy.top.key \  # 默认私钥路径
  --fullchain-file /root/.acme.sh/www.huangcy.top_ecc/fullchain.cer \  # 默认完整证书链路径
  --reloadcmd "/usr/local/nginx/sbin/nginx -s reload"  # 必须用nginx绝对路径

也可以使用自定义路径:
acme.sh --install-cert -d www.huangcy.top \
  --key-file /usr/local/nginx/conf/ssl/www.huangcy.top.key \     #这里可以写默认路径,也可以自定义,如果使用自定义路径要确保已创建
  --fullchain-file /usr/local/nginx/conf/ssl/www.huangcy.top.cer \   #这里可以写默认路径,也可以自定义,如果使用自定义路径要确保已创建
  --reloadcmd "nginx -s reload"   #这里要写nginx程序路径,编译安装就是/usr/local/nginx/sbin/nginx

5,验证定时任务

[root@VM-0-8-centos ~]# crontab -l | grep acme.sh   有以下输出即可
7 13 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

注意:

1,后面重启ng或者是重新加载可能有warn级别提示:nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/root/.acme.sh/www.huangcy.top_ecc/fullchain.cer"

ssl_stapling 是 Nginx 的 OCSP 装订功能,访问时不去远程客户端查询证书合法性而是查询本地,目前没找到解决办法,但是不影响安全性,可以选择关闭ng的这个功能:

操作:注释相关配置即可

ssl_stapling on;

ssl_stapling_verify on;

resolver 8.8.8.8 114.114.114.114 valid=300s; # 公共DNS解析器,resolver 只为ssl_stapling服务


评论