• 隐藏侧边栏
  • 展开分类目录
  • 关注微信公众号
  • 我的GitHub
  • QQ:1753970025
Chen Jiehua

Let’s Encrypt,免费 HTTPS 证书 

目录

最近浏览自己博客的时候,经常发现网站右下角被插入了广告……运营商果然是各种无赖,劫持流量投广告这么流氓的事情也给我遇上了。于是折腾着给自己的博客弄个 HTTPS 证书,发现 Let’s Encrypt 是个好东西……

HTTPS

为了给我们的网站开启 HTTPS,我们需要从证书认证中心(Certificate Authority,CA)获取一个证书(一个特殊的文件)。Let’s Encrypt 就是其中的一家 CA,要能够正常取得网站证书,首先我们需要保证拥有网站域名的所有权。对于Let’s Encrypt,我们可以使用 ACME 协议的工具来申请证书。

证书申请过程分为两步:首先我们向CA证明我们拥有这个域名,然后就可以请求、更新、废除这个域名的证书了。

域名验证

Let’s Encrypt 可以通过不同的方式来验证域名:

  • 给域名绑定一个特殊的DNS解析;
  • 在域名特定的URI下提供一个HTTP资源;

在验证域名的同时,Let’s Encrypt 也会提供一个随机数,我们必须使用自己的私钥(第一次需要先 生成密钥对)进行签名。

当我们完成上述操作之后,CA 就会开始检验:随机数的签名,特定URI的HTTP资源是否可访问。

证书签发

一旦上面的验证通过,就可以开始获取证书了。

首先,我们构造一个带有特定公钥的 PKCS#10 格式的证书签名请求 来让Let’s Encrypt为我们的域名签发证书。通常,CSR中包含了公钥对应的秘钥的签名;同时,我们也会对整个CSR进行签名保证Let‘s Encrypt能够相信CSR的真实性。

Let’s Encrypt CA收到请求后,它会同时验证两个签名。如果一切正常,它就会使用CSR中的公钥为我们的域名进行签发一个证书。

证书申请

申请Let’s Encrypt不但免费,过程也非常简单。虽然证书有效期只有三个月,不过我们可以将证书更新脚本添加到 crontab,这样后面也不需要我们手动操作了。

为了方便,我们直接采用官方推荐的 Certbot 工具。Certbot 在 Ubuntu 下没有提供合适的包,我们直接从官方下载安装:

wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto

certbot-auto 的命令与 cerbot 一致,它同时会安装自身需要的依赖。

假设我们的服务器上已经配置好了 Nginx(或者其他的WebServer),我们可以使用 webroot 这个插件。

certbot-auto certonly --webroot -w /var/www/blog -d chenjiehua.me -d www.chenjiehua.me

我们可以一次性指定多个 -w-d 来申请多个证书使用 webroot 这个插件时,必须保证 隐藏目录 ./well-known 可以通过web访问(./well-known/acme-challenge)。

操作完成后可以在 /etc/letsencrypt/live/chenjiehua.me 目录下面看到生成的证书文件:

  • cert.pem:我们的域名证书;
  • chain.pem: Let’s Encrypt的链证书
  • fullchain.pem: cert.pem 和 chain.pem 的组合;
  • privkey.pem:证书私钥;

其中 fullchain.pem 和 privkey.pem 就是我们后面需要使用的证书文件。

证书更新

每次签发的证书只有90天有效期,因此我们需要自动对证书进行更新。

certbot-auto renew --dry-run

通过 –dry-run 来测试是否正常,然后就可以通过系统的 crontab 来定期更新:

certbot-auto renew --quiet --no-self-upgrade

服务器配置

网站配置

博客:

修改配置文件中网站域名相关的选项。

Gitlab:

为 Gitlab 配置 https 后,除了修改配置文件等之外,还需要重新生成静态资源,否则浏览器会报 Mixed-Content 错误:

sudo -u git -H bundle exec rake assets:clean assets:precompile cache:clear RAILS_ENV=production

Nginx配置

配置 HTTP 自动跳转到 HTTPS:

server {
    listen 0.0.0.0:80;
    server_name chenjiehua.me www.chenjiehua.me;
    return 301 https://$host$request_uri$is_args$args;
}

server {
    listen 0.0.0.0:443 ssl;
    server_name chenjiehua.me www.chenjiehua.me;
    ssl_certificate /etc/letsencrypt/live/chenjiehua.me/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/chenjiehua.me/privkey.pem;
    ...
}

配置 ./well-known 供Web访问:

location ~ /.well-known {
     root /var/www/letsencrypt;
}

 

配置完成后,访问博客域名前面多了个绿色的小锁头,看着也是蛮爽滴 ^_^

参考:

码字很辛苦,转载请注明来自ChenJiehua《Let’s Encrypt,免费 HTTPS 证书》

评论