使用 Let's Encrypt 加密站点

付费的证书,买不起,就想起了免费证书发行商,Let's Encrypt,那就搞起来吧,不能让贫穷限制了我的脚步。

渴望的爱情

什么是 Let’s Encrypt?

部署 HTTPS 站点的时候需要证书,证书是由 CA 机构签发的,但是大部分 CA 机构签发证书是需要 money 的,这样呢不利于 HTTPS 在穷人之间的推动。

于是就来了一个Let’s Encrypt ,免费签发 CA 证书,不要钱。

Let’s Encrypt 由于是非盈利性的组织,但是签发证书这个事情是需要成本的,所以他们搞了一个非常有创意的事情,设计了一个 ACME 协议。传统的 CA 机构是人工受理证书申请、证书更新、证书撤销,完全是手动处理的。而 ACME 协议规范化了证书申请、更新、撤销等流程,只要一个客户端实现了该协议的功能,通过客户端就可以向 Let’s Encrypt 申请证书,也就是说 Let’s Encrypt CA 完全是自动化操作的。

基于 ACME 协议任何人都可以实现一个客户端,官方推荐的是:Cerbot,也是我们下面要使用的。完整的 ACME 客户端列表 在这里。

证书类型

  1. 单域名证书:一张证书对应一个域名

  2. SAN 证书:一张证书可以包括多个域名,但是有限制;

  3. 通配符证书:证书关联的域名可以包含一个通配符,例如:*.fudenglong.site,这样我这个站点下面的所有域名都可以使用这个证书了;

记录通配符证书申请流程

安装客户端:Cerbot

Cerbot 主页 选择你使用的操作系统和服务器软件,然后就有相关的安装命令提示,下面记录在Centos7 with Nginx
的安装流程以及遇到的坑。

  1. 由于 Cerbot 是在 EPEL上,所以首先你必须启用 EPEL 仓库,简单的命令就是:

    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

    详情请看:启用EPEL仓库

  2. 执行命令安装:sudo yum install python2-certbot-nginx

  3. 如果执行命令:certbot --version 出现正确的版本信息那就算成功了,如果报错了,那就说明我们要躺坑了,不过别怕,我都过来了,相信你也没事的。

遇到的错误如下,安装Cerbot错误

解决之道 参考这里,总结出来就是卸了重装:

  pip uninstall requests   urllib3
  yum remove python-urllib3 python-requests
  yum install python-urllib3 python-requests certbot

Cerbot 使用文档参考这里

申请证书

我这里使用了手动模式,我怕整坏我的Nginx,一条命令:

    certbot certonly  -d *.fudenglong.site --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

这个期间会有很多让你确认的,如果你想用记着点是就行了,不过中间有个部分要确认域名所有者,别瞎点,--preferred-challenges dns 意思就是通过 DNS 校验域名所有者的方式

申请过程:
申请过程

添加解析记录:
添加解析

添加完查询下解析成功没,成功了就可以进行下一步了:
查询解析

解析成功之后,会到刚才的位置,按Enter键就可以进行下一步了,成功之后如下图:
申请成功

证书是有有效期的,所以要定期更新。

然后可以使用命令:openssl x509 -in /etc/letsencrypt/archive/fudenglong.site/cert1.pem -noout -text 校验证书

查看申请的证书:certbot certificates

    [root@server-122 22:13 fudenglong.site]# certbot certificates
    Saving debug log to /var/log/letsencrypt/letsencrypt.log

    -------------------------------------------------------------------------------
    Found the following certs:
    Certificate Name: fudenglong.site
        Domains: *.fudenglong.site
        Expiry Date: 2018-09-27 13:01:54+00:00 (VALID: 89 days)
        Certificate Path: /etc/letsencrypt/live/fudenglong.site/fullchain.pem
        Private Key Path: /etc/letsencrypt/live/fudenglong.site/privkey.pem

配置Nginx

server
{
    listen 80;
    listen 443 ssl;
    server_name blog.fudenglong.site;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/blog.fudenglong.site;

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #HTTP_TO_HTTPS_START,强制HTTPS
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    /etc/letsencrypt/live/blog.fudenglong.site/fullchain.pem;
    ssl_certificate_key    /etc/letsencrypt/live/blog.fudenglong.site/privkey.pem;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    error_page 497  https://$host$request_uri;

    #SSL-END

    #ERROR-PAGE-START  错误页配置,可以注释、删除或修改
    error_page 404 /404.html;
    error_page 502 /502.html;
    #ERROR-PAGE-END

    #PHP-INFO-START  PHP引用配置,可以注释或修改
    include enable-php-71.conf;
    #PHP-INFO-END

    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /www/server/panel/vhost/rewrite/blog.fudenglong.site.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.project|LICENSE|README.md)
    {
        return 404;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        access_log off; 
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
        access_log off; 
    }
    access_log  /www/wwwlogs/blog.fudenglong.site.log;
}

原文链接

本文章首发在 PythonCaff

让所有的 痛苦绝望失利不满 都成为奋斗的动力,拥有选择的权利。