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/
创建文件夹,之后申请的证书会放到这个文件夹下面。
相比于Certbot
,acme.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
站点就是...?
One comment
哇好棒