Code is cheap, talk is expensive
话说从我开始折腾博客的时候就接触到了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 列表。
最简单的还是脚本直接安装,非常方便。
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
的使用,我想没有什么比官网的文档更清楚移动的了。
我再怎么写下去也不过是把官网的文档复制过来。
如何申请一个证书
https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert
这里简要说一下,申请证书的条件是,要确认你拥有一个域名。
如何确认呢,有一下三种方法。
这种方法就是你已经有了正在运行的 web 服务器,然后在你的 web 服务器存放challenge
文件,如果letencrypt
访问你的服务器能拿到这个文件,说明你确实有这个域名的管理权限,自然给你办法证书啦。
这个就是你还没有 web 服务器正在运行,不过没有关系,acme.sh
会模拟一个 web 服务器,来帮你完成认证。
最后一个就是直接通过配置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
如果以前顺利的话,你就成功的申请到了你的泛域名证书。
接下来就是如何使用你的证书了。
现在申请好的证书还保存在~/.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 协议和 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
站点就是...?