Let's Encrypt-免费HTTPS证书申请

let-encrypt-banner.gif

背景知识

HTTPS可以看作是 HTTP + Secure 的缩写,即安全的超文本传输协议,和HTTP相比,HTTPS通信是建立在一条加密通道上进行的,能够保证数据的完整性和机密性。如果将自己的网站从HTTP升级到HTTPS,首先需要拥有CA颁发的证书,常见的证书分为下面几类

EV证书,安全性最高,浏览器访问时地址栏能显示绿色的企业信息,多用于银行等要求更高安全性的网站上 OV证书,安全性高,CA颁发的证书信息里有组织的信息,一般企业用的比较多 DV证书,这种类型的证书仅验证域名的信息,证书颁发时间快,只要你拥有域名的控制权,就可以为自己的域名申请DV性证书

ACME协议

ACME全称自动化证书管理环境,正因为有了ACME,大规模推进HTTPS才成为可能。通过ACME进行证书申请主要有以下几个步骤.

  1. 注册帐号

  2. 请求生成证书

  3. 根据CA提供的方法,验证自己对域名的所有权(控制权)

  4. 获取证书并下载

通过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="[email protected]"

 # 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