Letsencrpyt 申请泛域名笔记

话说从我开始折腾博客的时候就接触到了letsencrpyt,不为别的,只为有人打开破站的时候,能在地址栏的前头看到一个绿色的安全锁。

这个绿色的锁自然是今天的主题了,使用acme.sh申请免费的ssl证书。

acme.sh仓库

其实之前一直使用的是官方推荐的Certbot这个工具,虽然很好用,但是需要安装它,也就是要下载许多依赖。

而今天介绍的acme.sh是一个完全使用Shell实现的ACME协议的客户端

关于ACME协议你可以在这里查看最新更新

至于 ACME 协议是什么?

Automatic Certificate Management Environment 自动化证书管理环境,通过它我们可以实现证书的自动申请以及部署,可以大大的节省人员的管理及额外的配置工作。
ACME 的通信过程通过一系列的 API 进行,你可以通过类似 https://acme-v01.api.letsencrypt.org/directory 获取可以请求的 API 列表。

安装 acme.sh

最简单的还是脚本直接安装,非常方便。

curl https://get.acme.sh | sh
# 或者
wget -O -  https://get.acme.sh | sh

#Or 使用git安装
# 注意github的网速
git clone https://github.com/Neilpang/acme.sh.git
cd ./acme.sh
./acme.sh --install

安装完成后,会在你的家目录~/.acme.sh/创建文件夹,之后申请的证书会放到这个文件夹下面。

相比于Certbotacme.sh真的干净,因为它不会乱动你的目录或者文件。哪怕需要修改,也会在之后改回来。不过弊端就是你需要自己配置证书。而Certbot更像是傻瓜式的操作。

接着我们可以使用crontab -l来查看,acme.sh添加的定时任务,这个主要用来定时更新证书。

使用 acme.sh

关于acme.sh的使用,我想没有什么比官网的文档更清楚移动的了。

我再怎么写下去也不过是把官网的文档复制过来。

如何申请一个证书
https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert

这里简要说一下,申请证书的条件是,要确认你拥有一个域名。

如何确认呢,有一下三种方法。

  • web root

这种方法就是你已经有了正在运行的 web 服务器,然后在你的 web 服务器存放challenge文件,如果letencrypt访问你的服务器能拿到这个文件,说明你确实有这个域名的管理权限,自然给你办法证书啦。

  • standalone

这个就是你还没有 web 服务器正在运行,不过没有关系,acme.sh会模拟一个 web 服务器,来帮你完成认证。

  • dns

最后一个就是直接通过配置dns来认证。

目前,这种方法是最舒服的方法,因为完全不用 web 服务器也可以认证,所以,你可以在任何有网络的地方完成认证。

但是,这种方法需要acme.sh支持你的域名服务提供商。

你可以在这里找到,acme.sh支持的 dns 域名服务商。

这里,我们使用cloudflare来申请证书。

cloudflare 现在支持设置泛域名解析了

首先要去 cloudflare 上申请API token,在我的个人资料->API 令牌->创建令牌->编辑区域 DNS

  • 权限选编辑
  • 区域选所有区域

创建好后,保存为CF_Token,接着在你的域名管理界面的下方,可以看到API区域,分别保存区域 ID (CF_Zone_ID)帐户 ID (CF_Account_ID)

接着使用export将上面三个 token 设置为环境变量。

# 设置CF的环境变量
# 这个变量只需用设置一次,申请完成后acme.sh会自动保存这些指
export CF_Token="sdfsdfsdfljlbjkljlkjsdfoiwje"
export CF_Account_ID="xxxxxxxxxxxxx"
export CF_Zone_ID="xxxxxxxxxxxxx"

# 申请 泛域名 证书
acme.sh --issue --dns dns_cf -d www.your_domain.com -d *.your_domain.com

如果以前顺利的话,你就成功的申请到了你的泛域名证书。

接下来就是如何使用你的证书了。

在 nginx 上使用证书

现在申请好的证书还保存在~/.acme.sh/的目录下面,由于其下面的目录结构可能会随着acme.sh的升级而发生改变,因此不推荐直接配置nignx使用下面的证书。

这里官方推荐使用--install-cert参数,来让acme.sh帮你复制证书文件到你设置的目录下面。

# nginx 示例

# 创建 ssl 文件夹 用来保存我们的证书
mkdir /etc/nginx/ssl

# 安装证书
acme.sh --install-cert -d example.com \
    --key-file       /etc/nginx/ssl/key.pem  \
    --fullchain-file /etc/nginx/ssl/cert.pem \

对于nginx这里的

  • key.pem 对应 ssl_certificate_key
  • cert.pem 对应 ssl_certificate

证书自动更新

其实在我们使用--install-cert安装好证书的十分,acme.sh已经为我们做好了自动更新的工作。

也就是说 60 天后,acme.sh会更新你的证书。

是不是非常的方便和舒服?只要你的服务器不挂掉,就不用担心证书过期的问题。

如果你不放心你可以使用acme.sh --renew -d your_domain.com来更新一波,看一下是什么情况。

更新 acme.sh

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。

尽管如此,但是官网有如下说明

我们不打算对 ACME 功能进行重大更改,但是如果我们认为这样做很重要,我们将努力在足够的时间内平稳过渡,并尽可能提前进行沟通。 如果需要进行重大更改,系统管理员应保持将及时更新部署到其 ACME 客户端的能力。

其实是否更新acme.sh都是没有关系的。

# 升级 acme.sh 到最新版
acme.sh --upgrade

# 如果你不想手动升级, 可以开启自动升级:
acme.sh --upgrade --auto-upgrade

# 之后, acme.sh 就会自动保持更新了.
# 你也可以随时关闭自动更新:
acme.sh --upgrade --auto-upgrade 0

题外话

知乎上面有一个关于letsencrpyt的讨论

Let's Encrypt 的真正意义在于加密流量,避免国内各大 ISP 惯用的 HTTP 劫持,对于不知道 StartSSL 和沃通有免费 DV 证书的个人博客和小型资讯类门户的站长来说,也确实是雪中送炭。

我仅仅赞同上面这段话。

而这玩意对于稍微有点规模的商业网站来说,并没有什么卵用,因为 SSL 证书的意义并不只是加密流量,更重要的用途是证明网站你的网站是否真实合法,保证不是什么山寨的或是钓鱼的站点,而且同样都是被各大浏览器所信任,在证明效力上也有三六九等。通常越是高档次的证书,或者越贵的认证机构在颁发证书时,对于申请机构的真实性和合法性的审核程序就越是严谨而繁杂,价格也更高,但得到的证明效力也比 Let's Encrypt 的证书,或者其他廉价的证书都不知高到哪里去。

我配置ssl的本意,就是加密站点的流量,保护我的密码不泄露。

我想ssl被发明出来的本意也是用于加密流量,进而保证安全性吧。

至于站点是否合法,这个怎么扯到ssl上面了,我有些搞不懂。

难道不配置ssl站点就是...?

Last modification:August 31st, 2020 at 10:06 pm
要饭啦~