网站要上 HTTPS 却没有 SSL/TLS 证书?| 教你一招搞定免费的(泛域名)SSL/TLS 证书

6,354 阅读4分钟

好记性不如烂笔头。趁热记录下,给未来的自己

0 | 前言

现在的网站上 HTTPS 协议,已经是一个越来越普遍、逐渐趋于强制的一个需求了。想当年,遍地是 HTTP,域名被运营商劫持,各种弹广告,钓鱼的时代已经一去不复返了。

HTTPS 协议会更安全(其实也是相对的)。对用户来说,是一种安全上的保护。但对很多个人和团队开发者,增添了网站部署的障碍:对个人来说,部署个人博客网站的时候,需要先申请 SSL/TLS, 然后根据部署情况添加到流量网关处;对团队开发来说,有开发,测试和生产环境,每套环境都要部署 HTTPS。

很多人对怎么部署 HTTPS 的网站其实还是有很多疑问的:

  1. 怎么申请 SSL/TLS 证书?
  2. 花不花钱,有没有免费的 SSL/TLS 证书?
  3. 免费的 SSL/TLS 证书有什么限制?
  4. 申请下来的证书怎么来部署?

先说结论:

  1. 有免费的 SSL/TLS 证书,
  2. 免费的会有限制。

本文会根据以上痛点,聚焦并解决以下问题:

  1. 一键申请免费TLS证书;
  2. 支持泛域名解析;
  3. 到期自动续约

1 | 现有的方案

传统公有云

现在免费的 SSL/TLS 证书,可以通过各大云厂商申请,比如阿里云,腾讯云等。但是会有一定的限制:

  1. 只能申请单域名证书,如果是泛域名如 *.lanbitou.tech就需要购买(DV型2000元左右/年)
  2. 不同云厂商的免费单域名证书配额有限,阿里云是20个,腾讯云是50个,

也可以生成自签名的证书,但是这种证书一般浏览器不认,或者需要添加各种信任配置,本地开发调试到没问题,但是给到用户侧,肯定是不能这么操作的。

Let's Encrypt

除了以上的方案外,还可以基于 Let's Encrypt 生成免费证书。

Let’s Encrypt 是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。 借助Let’s Encrypt颁发的证书可以为我们的网站免费启用HTTPS(SSL/TLS). Let’s Encrypt 使用 ACME 协议来验证您对给定域名的控制权并向您颁发证书。要获得 Let’s Encrypt 证书,您需要选择一个要使用的 ACME 客户端软件。Let’s Encrypt 不控制或审查第三方客户端,也不能保证其安全性或可靠性。

官方提供了几种证书的申请方式方法

certbot#

它既可以仅为您获取证书,也可以帮助您安装证书(如果您需要的话)。它易于使用,适用于许多操作系统,并且具有出色的文档。

certbot.eff.org/

acme.sh#

目前 Let's Encrypt 免费证书客户端最简单、最智能的 shell 脚本,可以自动发布和续订 Let's Encrypt 中的免费证书

下面会介绍基于 acme.sh 来创建泛域名证书。

2 | 一招白嫖

前提条件

  1. 已经有域名 且 域名是通过这些域名服务商提供的,国内的有阿里云,腾讯云等
  2. 获取云厂商操作API 的 AccessKey ID和AccessKey Secret(通常在用户中心可以找到)
  3. 如果不满足1或2,不代表不能使用 acme.sh,可以手工添加 dns 解析来认证。满足1和2可以使用generate_tls_cer.sh来一键生成证书。

generate_tls_cer.sh

#!/bin/bash -e
# created by lanbitou

install_acme (){
  echo -e "\033[32m ====> check if acme.sh is installed ... \033[0m"
  if [ -e $HOME/.acme.sh/acme.sh ]; then
      echo -e "\033[32m ====> acme.sh is installed  ... \033[0m"
      return 0
  fi
  echo -e "\033[32m ====> acme.sh is not installed, installing ... \033[0m"
  curl https://get.acme.sh | sh
  if [ $? != 0 ]; then
    echo -e "\033[31m ====> acme.sh installed from origin failed, try backup source ... \033[0m"
    curl https://gitee.com/neilpang/acme.sh | sh
    if [ $? != 0 ]; then
      echo -e "\033[31m ====> acme.sh installed failed, aborted ... \033[0m"
      return 1
    fi
  fi
  return 0
}

dns="$1"
domain="$2"
install_acme
if [ $? != 0 ]; then
  exit 1
fi

echo -e "\033[32m ====> start to generate tls certificates by acme.sh \033[0m"

$HOME/.acme.sh/acme.sh --issue --dns $dns -d $domain --force
if [ ! -d $domain ]; then
  mkdir $domain
fi
cp $HOME/.acme.sh/$domain'_ecc'/* $domain/
echo -e "\033[32m ====> tls certificates generated successfully! Find them in ./$domain. \033[0m"

使用方式

这里以阿里云举例

export Ali_Key="LTAI4F************ios2r"
export Ali_Secret="nIpymix0s****a0b****RE****SrkF" 
bash generate_tls_cer.sh dns_ali *.lanbitou.tech

如出现如下结果,表示生成证书成功。 image.png

以上。

(如果对 SSL/TLS 证书部署到网站,提供 HTTPS 协议访问网站有问题,欢迎评论区交流。)