Let's Encrypt-免费HTTPS证书申请
### 背景知识
HTTPS可以看作是 HTTP + Secure 的缩写,即安全的超文本传输协议,和HTTP相比,HTTPS通信是建立在一条加密通道上进行的,能够保证数据的完整性和机密性。如果将自己的网站从HTTP升级到HTTPS,首先需要拥有CA颁发的证书,常见的证书分为下面几类
EV证书,安全性最高,浏览器访问时地址栏能显示绿色的企业信息,多用于银行等要求更高安全性的网站上 OV证书,安全性高,CA颁发的证书信息里有组织的信息,一般企业用的比较多 DV证书,这种类型的证书仅验证域名的信息,证书颁发时间快,只要你拥有域名的控制权,就可以为自己的域名申请DV性证书
ACME协议
ACME全称自动化证书管理环境,正因为有了ACME,大规模推进HTTPS才成为可能。通过ACME进行证书申请主要有以下几个步骤.
注册帐号
请求生成证书
根据CA提供的方法,验证自己对域名的所有权(控制权)
获取证书并下载
通过Let's Encrypt申请免费证书
Let’s Encrypt是由互联网安全研究组维护的一个免费,公开透明的数字证书机构,旨在为公众提供免费的数字证书。通过ACME协议我们能自动化的申请证书,对证书进行续期。
接下来我们以getssl脚步讲解详细的申请步骤。(文中的例子以我自己的博客域名为例)
1.下载Getssl,并赋予可执行权限
curl --silent https://raw.githubusercontent.com/srvrco/getssl/master/getssl > getssl
chmod 700 getssl
2.为自己的域名创建默认配置文件
./getssl -c fluyy.net
上面的命令执行后会在 ~/.getssl
目录下生成相应的配置文件
3.修改配置全局配置
vim ~/.getssl/getssl.cfg
# getssl.cfg
# 设置账户信息,可选设置
ACCOUNT_EMAIL="admin@fluyy.net"
# ACCOUNT_KEY是let's encrypt用来创建账户使用,同一个Account Key会在Let's Encrypt上生成一个Account ID
ACCOUNT_KEY_LENGTH=4096
# ACCOUNT KEY的保存位置
ACCOUNT_KEY="/home/fluyy/.getssl/account.key"
PRIVATE_KEY_ALG="rsa"
# 证书续期时间
RENEW_ALLOW="30"
PRIVATE_KEY_ALG="rsa"
4.修改域名对应的配置文件
vim ~/.getssl/fluyy.net/getssl.cfg
域名文件夹下的配置主要内容有:
# 指定证书颁发机构
CA="https://acme-v01.api.letsencrypt.org"
# 如果有多个自域名需要证书,在这里填上子域名
SANS="www.fluyy.net,blog.fluyy.net"
# Let's Encrypt提供了多种方法验证域名所有权。
# 最简单的办法是申请证书时,Let's Encrypt为当前域名生成一串token,
# 然后Let's Encrypt会访问带有token的地址(https://www.fluyy.net/.well-known/acme-challenge/{ your token})
# 如果访问成功,则说明你对这个域名拥有控制权。
# 这里指定token生成的位置
ACL=('/var/www/fluyy.net/web/.well-known/acme-challenge')
#下面的变量表示各种证书文件的保存位置
DOMAIN_CERT_LOCATION="/etc/ssl/fluyy.net.crt"
DOMAIN_KEY_LOCATION="/etc/ssl/fluyy.net.key"
CA_CERT_LOCATION="/etc/ssl/fluyy.net.chain.crt"
# 证书生成成功后,服务器重启命令,我这里用的是nginx
RELOAD_CMD="nginx -s reload"
5.更新nginx的配置
# 配置访问token的地址
server {
location ~ /\.well-known/acme-challenge {
root /var/www/fluyy.net/web/;
}
}
# 将所有的HTTP请求都重定向到HTTPS上
server{
listen 80;
server_name blog.fluyy.net www.fluyy.net;
rewrite ^(.*)$ https://$host$1 permanent;
}
# 配置HTTPS,设置证书以及协议,我这里开启了http2
server {
listen 443 ssl http2;
server_name blog.fluyy.net www.fluyy.net;
ssl on;
ssl_certificate /etc/ssl/fluyy.net.chain.crt;
ssl_certificate_key /etc/ssl/fluyy.net.key;
}
6.最后一步,执行脚本申请证书
./getssl fluyy.net
7.配置自动续期
由于Let's Encrypt颁发的证书只有90天的有效期,所以我们需要在证书失效前进行续期,getssl提供了续期的配置,只需将下面的命令加入crontab中即可
执行 crontab -e
在文本末尾加上下面的命令,定时更新证书
23 5 * * * /root/scripts/getssl -u -a -q