2

为了推广HTTPS协议,电子前哨基金会EFF成立了 Let's Encrypt,提供免费证书。

Let's Encrypt
一个于2015年三季度推出的数字证书认证机构,将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。

部署HTTPS,包含

  1. 申请域名

  2. 部署 Web 应用,并开启服务。如 Nginx,Apache 等

  3. 获取证书

  4. 配置 Web,如商品监听,指定证书等。

本篇总结在 CentOS 和 Nginx 上安装 Let's Encrypt 签发的证书的过程。

安装 certbot

使用 certbot 获取 SSL 证书
sudo yum install epel-release
sudo yum install certbot

对于 Nignx ,certbot 使用 webroot 的插件获取 SSL。这款插件会在 [your webroot path]/.well-known 生成特殊的文件,在申请证书时,Let's Encrypt 服务会通过 Http 来访问此文件,以签证服务器,所以在使用 certbot 获取证书之前,你需要确保此目录能被外界使用访问。

修改Nginx配置

可以先不修改 nginx 的配置,继续往下走,如果获取证书过程中提示无法访问 /.well-known,才去修改 nginx 的配置,在 server 块里添加如下代码

location ~ /.well-known {
        allow all;
}

然后,重启或 reload nginx,即 sudo service nginx restart

获取证书

sudo certbot certonly -a webroot --webroot-path=/usr/share/nginx/html -d example.com -d www.example.com

  1. --webroot-path 改为你的 webroot path, webroot插件会在此目录下生成前面提到的 .well-known

  2. 使用 -d 指定域名。example.com改为你的域名,如果有多个域名,可以多次 -d 指定

clipboard.png

clipboard.png

最终会在 /etc/letsencrypt/live/example.com 下,生成四个 PEM 文件

  1. cert.pem: 域名证书

  2. chain.pem:Let's Enctrypt chain certificate

  3. fullchain.pem:cert.pem 和 chain.pem 组成

  4. privkey.pem:证书的私钥

执行 sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
生成 generate a strong Diffie-Hellman group,这一步不一定要

配置 Web 服务

upstream product{
    server 127.0.0.1:3001;
}
server{

### ssl 配置开始 ###

        listen 443 ssl;
        ssl_certificate /etc/letsencrypt/live/stu.kenniu.top/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/stu.kenniu.top/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        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_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security max-age=15768000;

 ### SSL 配置结束 #####


    server_name  stu.kenniu.top;
    #charset koi8-r;
    #access_log  logs/host.access.log  main;
#    location ~ /.well-known{
#       allow all;
#    }
    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_pass  http://product;
   }
}

ssl 相关的配置即完成了,在浏览器试一下 Https 已经可以访问

接下来新建一个Nginx的配置,将http的请求转发为https

clipboard.png

自动更新证书

因为 Let's Encrypt 的证书有效期是90天,到期前要更新证书。certbot 提供了更新证书的命令 sudo cerbot renew。添加一个 conb job 来实现自动更新

sudo crontab -e

输入
30 2 1 /usr/bin/certbot renew >> /var/log/le-renew.log
35 2 1 /usr/bin/systemctl reload nginx

保存即可创建 cron job。以后每周1的凌晨2点30自动更新证书,2点35自动重启nginx。

clipboard.png

参考链接
https://www.digitalocean.com/...
https://certbot.eff.org/


啃先生
1.4k 声望1.2k 粉丝

前腾讯前端开发工程师,后来有一年时间经历参与创业,目前东南亚电商 Shopee,人在深圳。个人作品: