IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    使用 Let\'s Encrypt 证书部署 HTTPS

    啃先生发表于 2016-11-09 16:38:26
    love 0

    为了推广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/



沪ICP备19023445号-2号
友情链接