Let's Encrypt和ACME 协议
部署 HTTPS
网站时需要证书,证书由 CA 机构签发,大部分传统 CA 机构签发证书需要收费。Let’s Encrypt
也是一个 CA 机构,但这个 CA 机构是免费的!!!
为了控制开支,避免传统的大量人工操作,这个非盈利性组织CA机构,设计了一个 ACME协议
。
该协议规范化了证书申请、更新、撤销等流程,客户端通过该协议,可以向 Let’s Encrypt
申请证书,完全自动化操作的。
任何人都可以基于 ACME协议
实现一个客户端,官方推荐的客户端是Certbot
。
使用certbot代替acme.sh免费申请wildcard通配符证书和自动更新实践小结 https://zhuanlan.zhihu.com/p/108052155
acme.sh
acme.sh 实现了 acme协议, 可以从 let's encrypt 生成免费证书。
特点:
- 一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端。
- 完整的ACME协议实施。 支持ACME v1和ACME v2 支持ACME v2通配符证书
- 简单,功能强大且易于使用。你只需要3分钟就可以学习它。
- Let's Encrypt免费证书客户端最简单的shell脚本。
- 纯粹用Shell编写,不依赖于python或官方的Let's Encrypt客户端。
- 只需一个脚本即可自动颁发,续订和安装证书。 不需要root/sudoer访问权限。
- 支持在Docker内使用,支持IPv6
操作命令
查看证书列表
acme.sh --list
删除证书
acme.sh remove Main_Domain
查看帮助
acme.sh --help
1.安装acme.sh
curl https://get.acme.sh | sh
安装过程中会自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书(可执行crontab -l 查看)。
00 00 * * * root /root/.acme.sh/acme.sh --cron --home /root/.acme.sh &>/var/log/acme.sh.logs
定时任务路径: /var/spool/cron/root
2.申请&下载证书
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证
HTTP 方式
:
acme.sh --issue -d chandao.test.com --webroot /data/wwwroot/chandao
只需要指定域名, 并指定域名所在的网站根目录【命令中/data/wwwroot/chandao为域名的根目录路径】. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
dns手动模式
:不能自动更新证书。在续订证书时,您必须手动向域中添加新的txt记录。
注: dns模式
不需要验证网站根目录的文件,故不要添加--webroot选项,否则程序会自作聪明地生成文件并验证。
# 生成DNS的TXT记录值
/root/.acme.sh/acme.sh --issue -d abc.com.cn --home /mnt/www/ssl --server letsencrypt --dns \
--yes-I-know-dns-manual-mode-enough-go-ahead-please --debug
# 把上一步生成的TXT记录值,手动填写到域名解析列表中。然后执行续期
/root/.acme.sh/acme.sh --renew -d abc.com.cn --home /mnt/www/ssl --server letsencrypt \
--yes-I-know-dns-manual-mode-enough-go-ahead-please --debug
https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode
3.安装证书
使用 --installcert
或 --install-cert
命令,并指定目标位置, 证书文件会被copy到相应的位置。
默认情况下,证书将每60天更新一次(可配置)。
NGINX
acme.sh --installcert -d chandao.test.com --key-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key --fullchain-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer --reloadcmd "service nginx force-reload"
APACHE
acme.sh --install-cert -d chandao.test.com \
--cert-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key \
--key-file /path/to/keyfile/in/apache/key.pem \
--fullchain-file /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer \
--reloadcmd "service apache2 force-reload"
更新证书后,将通过以下命令自动重新加载Apache / Nginx服务:
service apache2 force-reload
或
service nginx force-reload
4.安装(配置)NGINX 证书
server {
listen 80; #如果硬性要求全部走https协议,这一行去除
listen 443 ssl http2; #如果硬性要求全部走https协议,这里去除ssl
server_name chandao.test.com;
access_log off;
index index.html index.htm index.php;
root /data/wwwroot/chandao;
#ssl on; #如果硬性要求全部走https协议,这里开启ssl on
ssl_certificate /usr/local/nginx/ssl_cert/test.com/chandao.test.com.cer;
ssl_certificate_key /usr/local/nginx/ssl_cert/test.com/chandao.test.com.key;
#ssl性能调优
#nginx 1.13.0支持了TLSv1.3,TLSv1.3相比之前的TLSv1.2、TLSv1.1等性能大幅提升
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
#使用ssl_session_cache优化https下Nginx的性能
ssl_session_cache builtin:1000 shared:SSL:10m;
#OCSP Stapling 开启。OCSP是用于在线查询证书吊销情况的服务,使用OCSP Stapling能将证书有效状态的信息缓存到服务器,提高 TLS 握手速度
ssl_stapling on;
#OCSP Stapling 验证开启
ssl_stapling_verify on;
#error_page 404 /404.html;
#error_page 502 /502.html;
location ~ [^/]\.php(/|$) {
#fastcgi_pass remote_php_ip:9000;
fastcgi_pass unix:/dev/shm/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
expires 30d;
access_log off;
}
location ~ .*\.(js|css)?$ {
expires 7d;
access_log off;
}
location ~ /\.ht {
deny all;
}
}
如果是自己手动安装的acme.sh,其默认路径为 ~/acme.sh/
。
LNMP环境把文件放在了 /usr/local/acme.sh/
下
cd /usr/local/acme.sh/
acme.sh --renew -d [域名]
certbot
一、获取https证书
如果是CentOS 6、7,先执行:
yum install epel-release
wget https://dl.eff.org/certbot-auto --no-check-certificate
chmod +x ./certbot-auto
./certbot-auto -n
./certbot-auto -n只是用来安装依赖包的,也可以跳过直接到下面的生成证书的步骤,国内VPS或服务器上使用的话建议先修改为国内的pip源。
单域名生成证书:以下的文件夹自定义
./certbot-auto certonly --email 你的邮箱 --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.vpser.net(这个是文件夹名字,自定义,下同) -d www.vpser.net
多域名单目录生成单证书:(即一个网站多个域名使用同一个证书)
./certbot-auto certonly --email 你的邮箱 --agree-tos --no-eff-email --webroot -w /home/wwwroot/www.vpser.net -d www.vpser.net -d bbs.vpser.net
多域名多目录生成一个证书:(即一次生成多个域名的一个证书)
./certbot-auto certonly --email 你的邮箱 --agree-tos --no-eff-email --webroot -w /home/wwwroot/vpser.com -d wap.vpser.com -d seller.vpser.com -d staff.vpser.com -d admin.vpser.com -d api.vpser.com
提示
IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/www.vpser.net/fullchain.pem. Your cert will
expire on 2019-11-25. To obtain a new or tweaked version of this
certificate in the future, simply run certbot-auto again. To
non-interactively renew *all* of your certificates, run
"certbot-auto renew"
- If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
就是生成成功。
生成的证书会存在:/etc/letsencrypt/live/www.vpser.net/
目录下
二、nginx配置https映射
1.配置https
server {
listen 443 ssl;
server_name wap.vpser.com;
location / {
root /xxxx/xxxx/xxxx;
index index.html index.php index.htm;
client_max_body_size 500m;
autoindex on;
}
ssl on;
ssl_certificate /etc/letsencrypt/live/wap.vpser.com/fullchain.pem; #前面生成的证书,改一下里面的域名就行
ssl_certificate_key /etc/letsencrypt/live/wap.vpser.com/privkey.pem; #前面生成的密钥,改一下里面的域名就行
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
2.将http映射到https
server {
listen 80;
server_name wap.vpser.com;
location / {
add_header Content-Type 'text/plain;';
root /xxx/xxx/xxx;
return 301 https://wap.vpser.com$request_uri;
}
}
三、配置自动更新
执行代码:
crontab -e
添加定时器:
25 14 13 * * /root/certbot-auto renew --renew-by-default --renew-hook "/usr/nginx/sbin/./nginx -s reload"
手动更新LNMP创建的SSL证书 https://xyuxf.com/archives/1482
Linux下使用acme.sh 配置https 免费证书 https://www.cnblogs.com/-mrl/p/10601817.html
使用Certbot开启HTTPS访问 https://zhuanlan.zhihu.com/p/99360125
certbot https协议配置 https://www.cnblogs.com/guagua-19/p/10318832.html