在开始安装之前,我们需要先思考下为什么要安装 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 控制台去生成
export DP_Id="12345"
export DP_Key="abcdedf"
申请证书
申请泛域名证书,域名前面加 *
即可。
acme.sh --issue --dns dns_dp -d mangobeta.com -d *.mangobeta.com
安装证书
由于 Let’s Encrypt 证书3个月就会过期,acme.sh 会创建一个定时任务,自动会为证书续期。
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 配置
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;
}
}