好记性不如烂笔头。趁热记录下,给未来的自己
0 | 前言
现在的网站上 HTTPS 协议,已经是一个越来越普遍、逐渐趋于强制的一个需求了。想当年,遍地是 HTTP,域名被运营商劫持,各种弹广告,钓鱼的时代已经一去不复返了。
HTTPS 协议会更安全(其实也是相对的)。对用户来说,是一种安全上的保护。但对很多个人和团队开发者,增添了网站部署的障碍:对个人来说,部署个人博客网站的时候,需要先申请 SSL/TLS, 然后根据部署情况添加到流量网关处;对团队开发来说,有开发,测试和生产环境,每套环境都要部署 HTTPS。
很多人对怎么部署 HTTPS 的网站其实还是有很多疑问的:
- 怎么申请 SSL/TLS 证书?
- 花不花钱,有没有免费的 SSL/TLS 证书?
- 免费的 SSL/TLS 证书有什么限制?
- 申请下来的证书怎么来部署?
先说结论:
- 有免费的 SSL/TLS 证书,
- 免费的会有限制。
本文会根据以上痛点,聚焦并解决以下问题:
- 一键申请免费TLS证书;
- 支持泛域名解析;
- 到期自动续约
1 | 现有的方案
传统公有云
现在免费的 SSL/TLS 证书,可以通过各大云厂商申请,比如阿里云,腾讯云等。但是会有一定的限制:
- 只能申请单域名证书,如果是泛域名如
*.lanbitou.tech
就需要购买(DV型2000元左右/年) - 不同云厂商的免费单域名证书配额有限,阿里云是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#
它既可以仅为您获取证书,也可以帮助您安装证书(如果您需要的话)。它易于使用,适用于许多操作系统,并且具有出色的文档。
acme.sh#
目前 Let's Encrypt 免费证书客户端最简单、最智能的 shell 脚本,可以自动发布和续订 Let's Encrypt 中的免费证书
下面会介绍基于 acme.sh 来创建泛域名证书。
2 | 一招白嫖
前提条件
- 已经有域名 且 域名是通过这些域名服务商提供的,国内的有阿里云,腾讯云等
- 获取云厂商操作API 的 AccessKey ID和AccessKey Secret(通常在用户中心可以找到)
- 如果不满足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
如出现如下结果,表示生成证书成功。
以上。
(如果对 SSL/TLS 证书部署到网站,提供 HTTPS 协议访问网站有问题,欢迎评论区交流。)