使用 acme.sh 安装 Let's Encrypt 证书

Lets-Encrypt-1024x410.png

开始安装之前,我们需要先思考下为什么要安装 TLS 证书?它解决了什么问题。

HTTP 三大风险

  • 窃听风险(eavesdropping):第三方可以获知通信内容。
  • 篡改风险(tampering):第三方可以修改通信内容。
  • 冒充风险(pretending):第三方可以冒充他人身份参与通信。

HTTPS 解决方案

  • 所有信息都是加密传播,第三方无法窃听。
  • 具有校验机制,一旦被篡改,通信双方会立刻发现。
  • 配备身份证书,防止身份被冒充。

既然有这么多风险,为什么早期大多数网站都还是使用 HTTP 协议呢?除去安全意识不够外,我认为证书成本也是不可忽略的因数。 像 mangobeta 这样的小博客,自然无力去购买 HTTPS 证书,而 Let’s Encrypt 将免费证书推广开来,让小网站也可以享受到通信的安全。

为什么使用 acme.sh?

acme.sh 实现了 acme 协议, 可以从 letsencrypt 生成免费的证书,简单方便。

这里以 DNS 为 DNSPOD,Nginx 作为 Server 为例:

acme.sh 使用示例

设置 DNSPOD key

到 DNSPOD 控制台去生成

1
2
export DP_Id="12345"
export DP_Key="abcdedf"

申请证书

申请泛域名证书,域名前面加 *即可。

1
acme.sh --issue --dns dns_dp -d mangobeta.com -d *.mangobeta.com

安装证书

由于 Let’s Encrypt 证书3个月就会过期,acme.sh 会创建一个定时任务,自动会为证书续期。

1
2
3
4
acme.sh --install-cert -d mangobeta.com \
--key-file /data/certs/mangobeta.com/mangobeta.com.key \
--fullchain-file /data/certs/mangobeta.com/fullchain.cer \
--reloadcmd "service nginx force-reload"

nginx 配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server {
    listen 80;
    server_name  mangobeta.com www.mangobeta.com;
    return 301 https://mangobeta.com$request_uri;
}

server {
    listen 443 http2 ssl;
    server_name mangobeta.com;
    charset utf-8;
    ssl_certificate     /data/certs/mangobeta.com/fullchain.cer;
    ssl_certificate_key /data/certs/mangobeta.com/mangobeta.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;

    root /var/www/html/mangobeta;

    location / {
        index   index.html index.php;
    }

}

参考文档

updatedupdated2020-10-222020-10-22
Load Comments?