zoukankan      html  css  js  c++  java
  • Let's Encrypt,免费好用的 HTTPS 证书

    转自:   https://imququ.com/post/letsencrypt-certificate.html?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io


    Let's Encrypt,免费好用的 HTTPS 证书

    很早之前我就在关注 Let's Encrypt 这个免费、自动化、开放的证书签发服务。它由 ISRG(Internet Security Research Group,互联网安全研究小组)提供服务,而 ISRG 是来自于美国加利福尼亚州的一个公益组织。Let's Encrypt 得到了 Mozilla、Cisco、Akamai、IdenTrust 和 Electronic Frontier Foundation 等众多大公司的支持,发展十分迅猛。

    申请 Let's Encrypt 证书不但免费,还非常简单,虽然每次只有 90 天的有效期,但可以通过脚本定期更新,配好之后一劳永逸。经过一段时间的观望,我也正式启用 Let's Encrypt 证书了,本文记录本站申请过程和遇到的问题。

    我没有使用 Let's Encrypt 官网提供的工具来申请证书,而是用了 acme-tiny 这个更为小巧的开源工具。以下内容基本按照 acme-tiny 的说明文档写的,省略了一些我不需要的步骤。

    创建帐号

    首先创建一个目录,例如 ssl,用来存放各种临时文件和最后的证书文件。进入这个目录,创建一个 RSA 私钥用于 Let's Encrypt 识别你的身份:

    openssl genrsa 4096 > account.key
    

    创建 CSR 文件

    接着就可以生成 CSR(Certificate Signing Request,证书签名请求)文件了。在之前的目录中,再创建一个域名私钥(一定不要使用上面的账户私钥):

    openssl genrsa 4096 > domain.key
    

    生成 CSR 时推荐至少把域名带 www 和不带 www 的两种情况都加进去,其它子域可以根据需要添加(目前一张证书最多可以包含 100 个域名):

    openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]
    subjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr
    

    配置验证服务

    我们知道,CA 在签发 DV(Domain Validation)证书时,需要验证域名所有权。传统 CA 的验证方式一般是往 admin@yoursite.com 发验证邮件,而 Let's Encrypt 是在你的服务器上生成一个随机验证文件,再通过创建 CSR 时指定的域名访问,如果可以访问则表明你对这个域名有控制权。

    首先创建用于存放验证文件的目录,例如:

    mkdir ~/www/challenges/
    

    然后配置一个 HTTP 服务,以 Nginx 为例:

    NGINXserver {
        server_name www.yoursite.com yoursite.com;
    
        location /.well-known/acme-challenge/ {
            alias ~/www/challenges/;
            try_files $uri @redirect;
        }
    
        location @redirect {
            rewrite ^/(.*)$ https://yoursite.com/$1 permanent;
        }
    }
    

    以上配置优先查找 ~/www/challenges/ 目录下的文件,如果找不到就重定向到 HTTPS 地址。这个验证服务以后更新证书还要用到,需要一直保留。

    获取网站证书

    先把 acme-tiny 脚本保存到之前的 ssl 目录:

    wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py
    

    指定账户私钥、CSR 以及验证目录,执行脚本:

    python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir ~/www/challenges/ > ./signed.crt
    

    如果一切正常,当前目录下就会生成一个 signed.crt,这就是申请好的证书文件。

    如果你把域名 DNS 解析放在国内,这一步很可能会遇到类似这样的错误:

    ValueError: Wrote file to /home/xxx/www/challenges/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg, but couldn't download http://www.yoursite.com/.well-known/acme-challenge/oJbvpIhkwkBGBAQUklWJXyC8VbWAdQqlgpwUJkgC1Vg
    

    这是因为你的域名很可能在国外无法访问,可以找台国外 VPS 验证下。我的域名最近从 DNSPod 换到了阿里云解析,最后又换到了 CloudXNS,就是因为最近前两家在国外都很不稳定。如果你也遇到了类似情况,可以暂时使用国外的 DNS 解析服务商。

    搞定网站证书后,还要下载 Let’s Encrypt 的中间证书。我在之前的文章中讲过,配置 HTTPS 证书时既不要漏掉中间证书,也不要包含根证书。在 Nginx 配置中,需要把中间证书和网站证书合在一起:

    wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem
    cat signed.crt intermediate.pem > chained.pem
    

    最终,修改 Nginx 中有关证书的配置并 reload 服务即可:

    ssl_certificate     ~/www/ssl/chained.pem;
    ssl_certificate_key ~/www/ssl/domain.key;
    

    配置自动更新

    Let’s Encrypt 签发的证书只有 90 天有效期,但可以通过脚本定期更新。例如我创建了一个 renew_cert.sh,内容如下:

    BASH#!/bin/bash
    
    cd /home/xxx/www/ssl/
    python acme_tiny.py --account-key account.key --csr domain.csr --acme-dir /home/xxx/www/challenges/ > signed.crt || exit
    wget -O - https://letsencrypt.org/certs/lets-encrypt-x1-cross-signed.pem > intermediate.pem
    cat signed.crt intermediate.pem > chained.pem
    service nginx reload
    

    这个脚本需要以 root 帐号运行,使用绝对路径比较保险。最后,修改 root 帐号的 crontab 配置,加入以下内容:

    0 0 1 * * /home/xxx/root_shell/renew_cert.sh >/dev/null 2>&1
    

    这样以后证书每个月都会自动更新,一劳永逸。

    几个问题

    Let’s Encrypt 证书的兼容性,所有操作系统、浏览器默认是否都能识别是大家最关心的问题。实际上,由于 Let’s Encrypt 与 IdenTrust 的 DST Root CA 做了交叉认证,兼容性还是不错的,目前我只是发现在 Android 2 和 Windows XP 下有问题(Firefox 的证书那一套是自己实现的,不依赖于系统,XP 下只有 Firefox 信任 Let’s Encrypt 证书),其它环境都正常。

    letsencrypt intermediate cert on winxp(Windows XP 不信任 Let’s Encrypt 的中间证书)

    另外一个问题有关 ECC 证书,官网表示计划将在 2016 年提供对 ECC 证书的支持:

    Right now all of our root and intermediate keys use RSA. We're planning to generate ECC keys and make an ECC option available to subscribers in 2016. via

    我个人建议:对于个人用户来说,如果非常在意证书兼容性,可以购买 RapidSSL Standard 或者 Comodo Positive SSL 这两种证书。其中 RapidSSL 证书一共才三级,比较小;Comodo Positive 有四级,但可以申请 ECC 证书;二者都有着不错的兼容性,也非常廉价(一年不到 10$)。当然,如果不用考虑 Windows XP 用户,那么强烈推荐 Let’s Encrypt!

    本文先写到这里,如果你在申请 Let’s Encrypt 证书的过程中遇到问题,可以给我留言,也欢迎交流各种心得!

    本文链接:https://imququ.com/post/letsencrypt-certificate.html参与评论


  • 相关阅读:
    LeetCode 252. Meeting Rooms
    LeetCode 161. One Edit Distance
    LeetCode 156. Binary Tree Upside Down
    LeetCode 173. Binary Search Tree Iterator
    LeetCode 285. Inorder Successor in BST
    LeetCode 305. Number of Islands II
    LeetCode 272. Closest Binary Search Tree Value II
    LeetCode 270. Closest Binary Search Tree Value
    LeetCode 329. Longest Increasing Path in a Matrix
    LintCode Subtree
  • 原文地址:https://www.cnblogs.com/leonxyzh/p/7288977.html
Copyright © 2011-2022 走看看