Let’s Encrypt
作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。
虽然目前Let’s Encrypt免费SSL证书默认是90天有效期,但是我们也可以到期自动续约,不影响我们的尝试和使用。
1. 准备工作
根据官方的要求,我们在VPS、服务器上部署Let’s Encrypt免费SSL证书之前,需要系统支持Python2.7以上版本以及支持GIT工具。
这个需要根据我们不同的系统版本进行安装和升级,因为有些服务商提供的版本兼容是完善的。
最为简单的就是Debian环境不支持,可以运行apt-get -y install git直接安装支持,
如果是CentOS直接运行yum -y install git-core支持。
这个具体遇到问题在讨论和搜索解决方案,因为每个环境、商家发行版都可能不同。
2. 快速获取SSL证书
Let’s Encrypt肯定是考虑到推广HTTPS的普及型会让用户简单的获取和部署SSL证书,所以可以采用下面简单的一键部署获取证书。
PS:在获取某个站点证书文件的时候,我们需要在安装PYTHON2.7以及GIT,需要将域名解析到当前VPS主机IP中。
# 获取Let's Encrypt程序
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
# 申请Let's Encrypt证书
# 格式 --email [邮箱地址] -d [域名1] -d [域名2]
./certbot-auto certonly --standalone --email xxx@mail.com -d itfinn.com -d www.itfinn.com
如果80端口被占用,会导致申请证书失败,可以先把占用80端口的应用停止。
比如我这里占用80端口的是Nginx:
nginx-s stop
./certbot-auto certonly --standalone --email xxx@mail.com -d itfinn.com -d www.itfinn.com
nginx
3. 应用
在完成Let’s Encrypt证书的生成之后,我们会在 /etc/letsencrypt/live/itfinn.com/ 域名目录下有4个文件就是生成的密钥证书文件。
cert.pem - Apache服务器端证书
chain.pem - Apache根证书和中继证书
fullchain.pem - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件
如果我们使用的Nginx环境,那就需要用到fullchain.pem和privkey.pem两个证书文件
配置nginx启用证书
在配置文件上新建一个server语块:
server {
listen 443 ssl;
server_name itfinn.com;
# SSL证书路径
ssl_certificate /etc/letsencrypt/live/itfinn.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/itfinn.com/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
access_log /var/log/nginx/sub.log combined;
location / {
# 内容与80端口的server块一样, copy一份过来
[…]
}
}
重新载入nginx:
nginx -s reload
现在 在浏览器中访问 https://itfinn.com 和 https://www.itfinn.com 测试一下HTTPS是否正常、浏览器有没有报证书错误。
HTTP重定向至HTTPS
把nginx配置文件中80端口的server语块改为如下:
server {
listen 80;
server_name itfinn.com;
#重定向
rewrite ^ https://$host$request_uri? permanent;
}
重新载入nginx即可。
自动更新证书
因为Nginx反代占用了80端口, 所以执行以下命令时需要先把Nginx停止, 执行完命令后再重启Nginx:
nginx -s stop
你可以使用以下语句来更新所有超过60天的证书:
./certbot-auto renew
也可以把更新命令写入/etc/crontab,实现自动更新:
# 写个自动更新脚本:
vim mod_ssl.sh
#!/bin/bash
/usr/sbin/nginx -s stop
/root/ssl/letsencrypt/certbot-auto renew --quiet
/usr/sbin/nginx
# 写入/etc/crontab
crontab -e
0 * * */2 * /bin/sh /root/ssl/letsencrypt/mod_ssl.sh
测试更新操作:
./certbot-auto --dry-run renew
强制提前更新证书:
./certbot-auto renew --force-renew
4. 使用 acme.sh 部署
使用 acme.sh 部署 Let’s Encrypt 通过阿里云 DNS 验证方式实现泛域名 HTTPS — 云淡然
acme.sh --issue --dns dns_ali -d *.itfinn.com -d itfinn.com \
--installcert \
--key-file /root/ssl/all_domain/itfinn.com/privkey.key \
--fullchain-file /root/ssl/all_domain/itfinn.com/fullchain.pem \
--reloadcmd "nginx -s reload"