手把手教你免费申请支持通配符的 SSL 证书

得益于 Google 等大厂的消灭 HTTP 运动和 Let’s Encrypt 非盈利组织的努力,越来越多的站点开始迁移到 HTTPS,下图是 Let’s Encrypt 的统计数据。

什么是 Let’s Encrypt

部署 HTTPS 网站的时候需要证书,证书由 CA 机构签发。大部分传统 CA 机构签发证书是需要收费的,这不利于推动 HTTPS 协议的使用。

Let’s Encrypt 是一个国外的非盈利的 CA 证书机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的 SSL/TLS 证书。

由 Linux 基金会托管,许多国内外互联网大厂都对其进行赞助,目前主流浏览器均已信任 Let’s Encrypt 发放的证书。

注意:Let’s Encrypt 颁发的都是 DV 证书,不提供 OV、EV 证书。

本文主要讲解如何免费申请和使用 Let’s Encrypt 颁发支持通配符的 SSL 证书。

通配符证书

通配符 SSL 证书旨在保护主域名以及旗下不限数量的子域,即用户可通过单个通配符 SSL 证书可保护任意数量的子域名。如果用户拥有多个子域名平台,可通过通配符 SSL 证书保护这些子域名。

但是目前 Let’s Encrypt 只支持同级子域名通配符。例如 *.demo.com 只支持 xx.demo.com 这类的,而不支持 xx.xx.demo.com。 而要支持二级通配符需要再次颁发二级通配符证书,类似 *.demo.demo.com。

注意:这种的二级通配符,要求一级域名是固定的。意思是不支持 *.*.demo.com。

使用 acme.sh 简化证书颁发操作

官方建议使用 Certbot 来申请证书 ,但是很长一段时期 Certbot 并不支持通配符证书申请(现在已经支持),而且对于证书自动续期支持的也不是很友好。

  • 安装 acme.sh
$ curl https://get.acme.sh | sh
# 或者
$ wget -O -  https://get.acme.sh | sh
# 或者
$ git clone https://github.com/Neilpang/acme.sh.git
$ ./acme.sh/acme.sh --install
  • 通过 DNS API 申请通配符证书

acme.sh 功能很强大,此处只介绍使用 Dns API 自动化申请通配符证书。目前支持包含阿里和 DNSPod 在内的 60 家 DNS 服务商。(参见 Currently acme.sh supports)

如果你的 DNS 服务商不提供 API 或 acme.sh 暂未支持,又或者处于安全方面的考虑,不想将重要的域名的 API 权限暴露给 acme.sh,可以申请一个测试域名,然后在重要域名上设置 CNAME(参见 DNS alias mode)。

假设您的域名在 DNSPod 托管,登陆 DNSPod 后台,依次打开 用户中心 ->安全设置 -> API Token -> 查看 -> 创建 API Token -> 输入任意 Token 名称 -> 确定 -> 保存 ID 和 Token 值(图中打码部分)。

# 如果使用了 DNS 别名,还需要增加 --challenge-alias 别名域名 参数。
# 为了防止 DNS 不生效,脚本会暂停 2 分钟,并倒计时(Sleep 120 seconds for the txt records to take effect),等待即可。
# 如果成功会出现 Cert success. 字样。

$ export DP_Id="你的ID"
$ export DP_Key="你的Token"
$ acme.sh --issue --dns dns_dp -d example.com -d *.example.com

# 不建议直接用 ~/.acme.sh 下的证书,参考 https://github.com/Neilpang/acme.sh/wiki/说明#3-copy安装-证书。
# 需要使用 --installcert 复制到指定目录。

$ acme.sh --installcert  \
-d  example.com -d *.example.com \
        --key-file /etc/letsencrypt/live/example.com/privkey.pem \
        --fullchain-file /etc/letsencrypt/live/example.com/fullchain.pem \
        --reloadcmd  "service nginx reload"

优化 HTTPS 配置

本文以 Mozilla SSL Configuration Generator 生成的 Nginx 为例,同样也可以生成 Apache 和 IIS 的。

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    
    # Redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    
    # certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:SSL:50m;
    ssl_session_tickets off;
    
    # Diffie-Hellman parameter for DHE ciphersuites, recommended 2048 bits
    # openssl dhparam -out /etc/letsencrypt/live/example.com/ 2048
    ssl_dhparam /etc/letsencrypt/live/example.com/dhparam.pem;
    
    # intermediate configuration. tweak to your needs.
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;
    
    # HSTS (ngx_http_headers_module is required) (15768000 seconds = 6 months)
    add_header Strict-Transport-Security max-age=15768000;
    
    # OCSP Stapling ---
    # fetch OCSP records from URL in ssl_certificate and cache them
    ssl_stapling on;
    ssl_stapling_verify on;

    ## verify chain of trust of OCSP response using Root CA and Intermediate certs
    # ssl_trusted_certificate /path/to/root_CA_cert_plus_intermediates;

    resolver <IP DNS resolver>;
    
    ....
}

检查 HTTPS 得分

访问 https://www.ssllabs.com/ssltest/ 提交自己域名,进行评分。

参考资料

  • Chrome 将不再标记 HTTPS 页面为安全站点
  • Let’s Encrypt Stats
  • About Let’s Encrypt
  • Mozilla SSL Configuration Generator
  • DV型、OV型、EV型证书的主要区别
  • Neilpang/acme.sh#Wiki#安装说明
  • Neilpang/acme.sh#Wiki#How to Install
  • Neilpang/acme.sh#Wiki#How to use DNS API

来源:安家的博客 原文:http://t.cn/EaW06eA 题图:来自谷歌图片搜索 版权:本文版权归原作者所有 投稿:欢迎投稿,投稿邮箱: editor@hi-linux.com

本文分享自微信公众号 - 运维之美(Hi-Linux)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券