LetsEncrypt的全站https

2018-03-24 fishedee 后端

1 概述

简单的Let’s Encrypt使用

2 安装

2.1 远程下载安装

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

下载并安装acme.sh

安装目录在/root/.acme.sh

2.2 github下载安装

git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install

下载github源文件后安装,重新启动bash来刷新环境变量

安装目录在/home/user/.acme.sh

0 0 * * * "/home/fish/.acme.sh"/acme.sh --cron --home "/home/fish/.acme.sh" > /dev/null

安装完成后,会自动添加crontab的定时任务来自动刷新域名,可以用crontab -l来查看该定时任务

3 生成证书

3.1 自动证书

sudo su
export Ali_Key="sdfsdfsdfljlbjkljlkjsdfoiwje"
export Ali_Secret="jlsdflanljkljlfdsaklkjflsa"
acme.sh --issue --dns dns_ali -d example.com -d *.example.com

目前Let’s Encrypt可以生成泛域名证书,默认有效期只有90天。而且,多个-d参数指定绑定的多个域名。我上面的这段命令是用dns来验证域名的拥有权,acme.sh支持直接输入阿里云解析的key和secert来配置dns解析。注意,进行了这一步以后,acme.sh会自动保存阿里云信息到安装目录的account.conf文件下,方便下次自动刷新时使用

Screen Shot 2018-08-19 at 11.25.03 P

生成的证书就是放在/root/.acme.sh/example.com的文件夹下面。其中,fishedee.com.cer是公有钥匙,fishedee.com.key是私有钥匙,fullchain.cer是包含证书链的公有钥匙。

openssl x509 -in fishedee.com.cer -noout -dates

可以在命令行查看ssl证书的有效期。

对于使用github安装的方式,它会在/home/user/.acme.sh目录下生成,其他流程一样

3.2 手动证书

acme.sh --issue -d fishedee.com -d *.fishedee.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

4 配置nginx

upstream gallery {
        server localhost:8299;
        keepalive 10;
}

server {
        listen 443 ssl;
        listen [::]:443 ssl;

        ssl on;

        ssl_certificate   /etc/nginx/ssl/cert.pem;
        ssl_certificate_key  /etc/nginx/ssl/key.pem;
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;

        server_name fishedee.com  www.fishedee.com;

        location / {
                proxy_http_version 1.1;
                proxy_set_header Connection "";
                proxy_pass http://gallery;
        }
}

server {
        listen 80;
        listen [::]:80;

        server_name fishedee.com www.fishedee.com;
        rewrite ^(.*) https://fishedee.com$1 permanent;
}

这就是一份简单的nginx配置,注意它会将http连接自动转向到https连接。

sudo service nginx restart

配置好以后,重启nginx

Screen Shot 2018-03-24 at 10.52.17 P
Screen Shot 2018-03-24 at 10.52.34 P

我将fishedee.com设置为https以后,依然提示no secure。打开console一看,发现是图床没有使用https。

Screen Shot 2018-03-24 at 11.02.53 P

解决方法很简单,将图床也转为https就可以了。用certbot生成image.fishedee.com的证书,然后放到七牛上就可以了。

5 自动更新证书

由于let’s encrypt的证书只有90天的有效期,剩余30天左右就需要自己去更新证书了,比较麻烦。自带的certbot支持在crontab上加入配置以自动更新证书,但是并没有提供同步到第三方证书的功能,例如是远程的七牛服务。

{
    "interval":"1m",
    "deploy":[
        {   
            "name":"qiniu_fishedee",
            "type":"qiniu",
            "access_token":"xxxx",
            "access_secert":"xxxx",
            "domain":"xxxx"
        },
        {   
            "name":"nginx_fishedee",
            "type":"nginx",
            "address":"127.0.0.1"
        }
    ],
    "renew":[
        {
            "cert_name":"fishedee.com",
            "deploy":["nginx_fishedee","qiniu_fishedee"]
        }
    ]
}

因此,顺手写了一个certbot-renew的服务,支持同步七牛服务器的证书。在本地的conf.json输入以上配置,然后make release就可以了。

6 客户端根证书

默认情况下,客户端都会支持Let’s Encrypt签名的证书。但是部分情况下某些客户端并不支持新版的Let’s Encrypt签名,这个时候我们就需要手动添加Let’s Encrypt的根证书了。

  • https://letsencrypt.org/certificates/
  • https://www.identrust.com/support/downloads

在Mac下,需要将根证书导入到Key Chain中才能正常使用。

7 总结

过程还是比较简单的,一次点亮。原来是使用certbot的,现在改用acme.sh方便多了。

相关文章