Let's encrypt!!! 给你的网站也设置HTTPS吧!

2017-10-18 · 🙈Lei · 0条 · 669次

HTTPS的全称是Hyper Text Transfer Protocol over Secure Socket Layer,也就是说HTTPS是HTTP的加强版,更为安全。HTTPS是借助Secure Socket Layer(SSL)作为HTTP应用层的子层进行加解密提高安全性。它的主要作用可以分为两种:1.建立一个信息安全通道,保证数据传输的安全性;2.确认网站的真实性,使用了https的网站,在浏览器中打开时会有一个绿色的锁标志,点击即可看到真实信息,也可以通过CA机构颁发的安全签章来查询。这就是为什么我们要使用https。

如果要使用https,必须要从CA机构那里获得证书。CA负责签发证书、认证证书和管理颁发的证书。

阿里云和腾讯云都提供了免费的HTTPS认证,但是需要去申请,然后定期更换,比较麻烦。所以这篇文章我介绍一种免费的更好的方式来使用https。

Let's encrypt就是一个CA机构,通过从Let's encrypt申请证书,我们可以把自己的网站设置为https访问。

4c86ceb38a-letsencrypt

Let's encrypt颁发的证书的有效期限是90天,过期后需要重新申请。下面介绍两种方式,不仅可以通过在Let's encrypt申请证书让自己的网站变为https,还能在到期之前自动重申,防止过期,一劳永逸。

> acme-tiny

1.创建一个Let's encrypt账户私钥

创建一个新的目录如ssl,来存放申请证书过程中的临时文件。首先我们进入这个目录,创建一个RSA私钥用于身份识别:

openssl genrsa 4096 > account.key

2.创建CSR(certificate signing request)

Let's encrypt使用的ACME协议需要一个CSR文件,更新的时候也需要,同一个CSR文件可以用于多次更新。生成CSR文件需要域名私钥,但是绝对不能使用上一步生成的账户私钥。

所以,我们先生成一个域名私钥

openssl genrsa 4096 > domain.key

然后生成CSR文件

#对于单个域名
openssl req -new -sha256 -key domain.key -subj "/CN=yoursite.com" > domain.csr
#多个域名(如果想要yoursite.com和www.yoursite.com同时支持https,使用下面的这行命令)
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr

注意:如果报错找不到/etc/ssl/openssl.cnf,请执行命令 whereis openssl.cnf ,查看你的linux系统中openssl.cnf文件在哪,然后将/etc/ssl/openssl.cnf替换为你系统中的目录。因为自己安装的openssl可能指定目录不同。

3.创建challenge文件进行验证

你必须证明你要配置https的域名所属人是你,本节下面的步骤就是教你如何验证。

Let's encrypt会在“.well-known/acme-challenge/”目录下生成一个随机文件,然后通过http请求访问这个目录,来验证域所有权。

首先创建一个文件夹(根据自己的需要更改目录)

mkdir /www/challenges/

然后修改服务器配置,在第2部中指定的domain(域名)的配置中做如下修改:

#example for nginx
server { 
    listen 80; 
    server_name yoursite.com www.yoursite.com; 
    location /.well-known/acme-challenge/ { 
        alias /www/challenges/; 
        try_files $uri =404; 
    }
   location / {
        rewrite ^/(.*)$ https://yoursite.com/$1 permanent;
    }
    ...the rest of your config 
}

上面的配置优先查找/www/challenges/目录下的文件,如果找不到就重定向到对应的https地址。域验证在证书自动更新中还要用到,所以文件夹和服务器配置请保留。

4.获取签名证书

下载acme-tiny脚本

wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

运行下面的脚本在第3步的目录下生成证书:

#run the script on your server
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /www/challenges/ > ./signed.crt

!!如果你使用的不是nginx服务器,使用上面的signed.crt和你的私钥就可以完成https的配置。

5.nginx配置

在nginx服务器中,需要将中间证书和网站证书合在一起

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

nginx https配置

server { 
    listen 80; 
    server_name yoursite.com www.yoursite.com; 
    location ^~ /.well-known/acme-challenge/ { 
        alias /www/challenges/; 
        try_files $uri =404; 
    }
    location / {
        rewrite ^/(.*)$ https://yoursite.com/$1 permanent;
    }
    ...the rest of your config 
}
server {
     listen 443;
     server_name yoursite.com, www.yoursite.com;
     ssl on;
     ssl_certificate /path/to/chained.pem;
     ssl_certificate_key /path/to/domain.key;
     ssl_session_timeout 5m;
     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
     ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
     ssl_session_cache shared:SSL:50m;
     ssl_dhparam /path/to/server.dhparam;
     ssl_prefer_server_ciphers on;
     ...the rest of your config
}

6.配置自动更新

新建脚本文件update_cert.sh,内容如下:

#!/usr/bin/sh
python /path/to/acme_tiny.py --account-key /path/to/account.key --csr /path/to/domain.csr --acme-dir /www/challenges/ > /tmp/signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat /tmp/signed.crt intermediate.pem > /path/to/chained.pem
service nginx reload

赋予该脚本执行权限

chmod a+x update_cert.sh

将该脚本加入crontab的自动执行。

crontab -e

加入下面的内容:

#每月1号的0点0分执行一次
0 0 1 * * /path/to/update_cert.sh > /dev/null 2>&1

> acme.sh

该方法操作简单,脚本帮我们完成了大部分工作。

1.安装acme.sh

curl https://get.acme.sh | sh

脚本会自动创建cronjob,每天0:00自动检测所有证书,如果快过期了,则会自动更新。

2.生成证书

(1)http方式

http方式需要在网站根目录下放置一个文件来验证域的所有权。你所做的只需要制定域名和域名所指向的网站根目录,脚本即可自动生成验证文件,并放到该目录,完成验证,并在最后删除该文件,操作如下:

acme.sh --issue -d yoursite.com -d www.yoursite.com --webroot /path/to/yoursite.com/

如果使用apache和nginx服务器,脚本还能自动完成验证,无需指定网站根目录。

#apache服务器
acme.sh --issue -d yoursite.com --apache
#nginx服务器
acme.sh --issue -d yoursite.com --nginx

acme.sh完成验证后,会恢复到之前的状态,不会私自更改本身配置。但是ssl配置需要自己动手配置,否则生成证书后也无法通过https访问。

如果你在验证过程中出现下面的错误是因为Let's encrypt在1个小时内只允许5次错误。等待1小时候重试。

(2)DNS方式

执行下面的命令:

acme.sh --issue --dns -d yoursite.com

会将相应的解析记录显示出来,你只需要在域名解析面板中添加相应的一条txt记录。

然后执行下面的命令重新生成证书

acme.sh --renew -d yoursite.com

或者你可以使用下面的接口方式自动添加:

DNS方式可以使用域名解析商提供的api接口自动添加一条txt类型的记录,目前acme.sh支持cloudflare,dnspod,cloudxns,godaddy以及ovh等数十种解析商的自动生成。

以dnspod为例,你需要先登录dnspod账号,生成api id和api key,然后执行下面的命令:

export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d yoursite.com -d www.yoursite.com

就可以自动生成证书了。这里的api id和api key会被自动记录下来,将来在使用dnspod api的时候,就可以使用下面的命令直接生成了:

acme.sh --issue -d yoursite2.com --dns dns_dp

3.安装证书

默认生成的证书都放在安装目录下的~/.acme.sh/下,请不要直接使用此目录下的文件,目录结构可能会变。正确的使用方法是使用--installcert命令将证书文件copy到相应的位置。

acme.sh --installcert -d yoursite.com \ --key-file /path/to/yoursite.key \ --fullchain-file /path/to/yoursite.cer \ --reloadcmd "service nginx force-reload"

证书更新以后,--reloadcmd后的命令会执行来让证书生效。

4.更新证书

证书会在60天后自动更新,今后可能脚本会自动更改该时间,不过是自动的。

5.更新acme.sh脚本

由于acme和letsencrypt CA都在频繁更新,因此acme.sh也在经常更新以保持同步。

手动升级acme.sh的命令:

acme.sh --upgrade

自动升级命令:

acme.sh --upgrade --auto-upgrade

关闭自动更新:

acme.sh --upgrade --auto-upgrade 0



  0