Let's Encrypt 证书申请实测

Intro

关于 Let's Encrypt 这个 CA,大概大家都知道了,可以以非常方便的过程签发免费的证书。在这个全民加密的年代,给自己的网站加上 HTTPS 还是很有必要的,可以有效地避免隐私泄露、运营商劫持等问题。这个博客也同样使用 Let's Encrypt 签发的证书,现在就来写写申请的过程是怎样的。

UPDATE: 请查看 acme.sh - 极力推荐的 Let's Encrypt 工具 这篇博文。


网上的教程有相当多的教程是 acme-tiny 这个轻量级的 acme 工具来实现的,但是我在这里还是使用了官方提供的工具,原因如下:

  • 对用户友好(交互界面)
  • 功能强大(可以 cert, revoke, renew 等)
  • 简单(大部分的操作都自动解决了)
  • 自动按域名存储到统一的目录下(对我这种懒人特别友好)

当然缺点也十分明显,这玩意就是个开源全家桶……不过反正是 VPS 我也无所谓了,DO 网速也挺快,pass


申请过程

首先关闭 Nginx

sudo service nginx stop

下载 LE 官方提供的工具:

git clone https://github.com/letsencrypt/letsencrypt && cd letsencrypt

然后就可以开始申请过程了,非常方便,需要 root 权限

sudo ./letsencrypt-auto --agree-dev-preview --server \ https://acme-v01.api.letsencrypt.org/directory auth

装好全家桶之后会提示输入邮箱


然后提示输入你的域名,LE 不支持通配,所以要输入完整的域名。例如 files.niconiconi.xyz。申请很快,下来的证书存储在 /etc/letsencrypt/live/your_domain

DHPARAM

理论上证书已经下来了,不过为了增加安全性,最好再有一个 Diffie Hellman Ephemeral Parameters。

进入目录:

cd /etc/ssl/certs

使用 OpenSSL 生成 dhparam.pem:

sudo openssl dhparam -out dhparam.pem 4096

这步要非常多的时间(毕竟 4096 位呢),我的用了半个小时。解释一下各符号的意思:

  • . 可能的质数
  • + 验证的质数
  • * 找到的质数

配置服务器

以 Nginx 为例,用你最喜欢的编辑器打开配置文件:

sudo vim /etc/nginx/sites-enabled/your_config_file

秀上我的配置

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
}

也可以开启 HSTS,强迫浏览器使用 HTTPS:

add_header Strict-Transport-Security "max-age=2592000; includeSubDomains";

Cool! 现在启动服务器,应该就可以使用 HTTPS 了:

sudo service nginx start

HTTP 重定向

如果想要进一步安全性,可以把 HTTP 重定向到 HTTPS。NGINX 配置如下:

server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}

这下访问 http://yourdomain.com 的时候,会自动重定向到 https://yourdomain.com,不需要用户做任何操作。