申请Let's Encrypt 或Zerossl免费泛域名证书,实现全站Https,可自动续期

来源:赵克立博客 分类: 网络安全 标签:sslHttps发布时间:2021-11-25 11:58:33最后更新:2022-04-09 16:05:23浏览:1166
版权声明:
本文为博主原创文章,转载请声明原文链接...谢谢。o_0。
更新时间:
2022-04-09 16:05:23
温馨提示:
学无止境,技术类文章有它的时效性,请留意文章更新时间,如发现内容有误请留言指出,防止别人"踩坑",我会及时更新文章

前言

目前全网都在向https转,虽然网上很多申请免费证书的地方但一般都是单域名的,泛域名证书一般个人用户是用不起的,下面介绍个方法,

证书官方链接,二选一 

https://letsencrypt.org/

https://zerossl.com/

环境要求

  • Linux服务器一台,本文使用Ubuntu18

  • xxxx.com 域名一枚

  • DnsPod账号一个,用于解析xxxx.com这个域名

  • 懂得科学上网方法,因为要用到github可能会访问不到,能访问到的话忽略


下载安装脚本

后面-s email参数可省略,推荐加上

curl  https://get.acme.sh | sh -s email=my@example.com

2111251637811483473180.png

如果命令行实在下载不了,也可直接下载压缩包上传后再解压


注册邮箱

如果上面已经注册邮箱,则这一步可跳过

cd ~/.acme.sh 
./acme.sh --register-account -m 735579768@qq.com

DnsPos申请Token

登陆DnsPos后台

2111251637844851811436.png

如果上面已经创建成功的话,下面两步可忽略


https://www.dnspod.cn/console/user/security

2111251637811954412037.png

创建Id和Token

2111251637812112302947.png


生成证书

默认生成的证书是zerossl,如果想用let's则可在命令最后添加  --server letsencrypt   指定

export DP_Id="******"
export DP_Key="************************"
./acme.sh --issue -d xxxx.com -d *.xxxx.com --dns dns_dp   --log --cert-home /xxxxxx/nginx/ssl  --dnssleep 30

2111251637812401891668.png

最终会在以下目录生成证书文件

2111251637812211365298.png

上面步骤只需第一次生成时配置,想生成其它域名时可用下面一句命令就可完成, 后面--cert-home指定证书生成后存放的目录,--dnssleep 30  添加完dns记录后等30秒,默认是用国外dns来检测的,国内可能访问慢或访问不了

./acme.sh --issue -d bbbb.com -d *.bbbb.com --dns dns_dp   --log  --cert-home /xxxxxx/nginx/ssl  --dnssleep 30

Nginx部署

添加下面配置

server {
    listen       80;
    server_name  xxxx.com *.xxxx.com;
    root   /www/xxxx.com;
    index  index.php index.html index.htm;
    #charset koi8-r;
    #access_log /dev/null;
    access_log  /var/log/nginx/openresty.xxxx.com.access.log  main;
    error_log  /var/log/nginx/openresty.xxxx.com.error.log  warn;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   php74:9000;
        include        fastcgi-php.conf;
        include        fastcgi_params;
    }

}

server {
        listen       443 ssl;
        server_name  xxxx.com *.xxxx.com;
        # ssl on;
        # 开启 OCSP Stapling ---当客户端访问时 NginX 将去指定的证书中查找 OCSP 服务的地址,获得响应内容后通过证书链下发给客户端。
        ssl_stapling on;
        # 启用OCSP响应验证,OCSP信息响应适用的证书
        ssl_stapling_verify on;
        # 证书颁发结构的中间证书+根证书
        ssl_trusted_certificate /ssl/xxxx.com/ca.cer;
        ssl_certificate      /ssl/xxxx.com/fullchain.cer;
        ssl_certificate_key  /ssl/xxxx.com/xxxx.com.key;

    location ~ \.php$ {
        fastcgi_pass   php74:9000;
        include        fastcgi-php.conf;
        include        fastcgi_params;
    }
}

特别注意里面的以下配置,可加速客户端(浏览器)访问,具体可查阅 OCSP协议 相关

# 开启 OCSP Stapling ---当客户端访问时 NginX 将去指定的证书中查找 OCSP 服务的地址,获得响应内容后通过证书链下发给客户端。
ssl_stapling on;
# 启用OCSP响应验证,OCSP信息响应适用的证书
ssl_stapling_verify on;
# 证书颁发结构的中间证书+根证书
ssl_trusted_certificate /ssl/xxxx.com/ca.cer;

上面配置可视自己情况添加,原因如下:

2020年4月2日,大陆地区对Let's Encrypt的OCSP服务器(ocsp.int-x3.letsencrypt.org)所使用的Akamai CDN域名a771.dscq.akamai.net进行了DNS污染,导致部分浏览器首次访问使用Let's Encrypt证书的网站时无法完成OCSP检查,加载缓慢。


2020年11月20日,Let's Encrypt 推出了 R3 中间证书,使用了新的 OCSP 服务器地址(r3.o.lencr.org),问题得到解决


最后重新加载nginx配置文件

2111251637812598875627.png

三个月有效期,到期后自动生成


自动续期

在第一部安装成功后会自动添加一条crontab定时脚本,使用 crontab -l 查看最后一行添加的定时任务

56 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null

如果自定义了证书路径,或有新加的参数,就请修改定时任务中命令如下

/root/.acme.sh/acme.sh --cron --home /root/.acme.sh --cert-home /nginx/ssl  --dnssleep 30

修改后在命令行先测试下是否能自动续期,如下指定证书目录后会自动检测里面有哪些域名,然后把命令替换上去

2111251637844315130301.png

原文安装教程

https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E



微信号:kelicom QQ群:215861553 紧急求助须知
Win32/PHP/JS/Android/Python