话说最近明月感觉 HTTPS 全面普及的时代已经来临了,这点儿从谷歌、百度、必应三大搜索引擎巨头们对 HTTPS 收录索引支持就可以看出来,HTTPS 将是未来网站安全协议的一个常态化存在了。反正,至少明月这两天看到无论是百度还是谷歌对 HTTPS 的收录和响应速度都非常的快了,谷歌是 24 小时内就完成了 HTTP 前缀已收录替换,百度是 1-3 天就完成了,同样的必应在这方面反映也是很迅速的。不说实际会有多少的 SEO 收获,至少从这些巨头们对待 HTTPS 的态度上看,HTTPS 已经是获得了认可。
所以说,对于我们这些草根博客站长们来说,部署 SSL 启用 HTTPS 也可以提到日程上来了。去年的时候 HTTPS 对于我们站长们来说还是有点“白富美”高攀不上的感觉。但是到今天来看,SSL 证书已经没有“白富美”的神秘感了,甚至连开源免费的 SSL 证书也都出现了。于是,最近明月已经把自己的四个站都给部署 SSL 证书了,目前已经全部搞定 HTTPS 了。很多站长们目前都是采取观望态度,也有不少因技术原因无法独立完成 SSL 部署,最近几天明月就结合自己部署 SSL 的经验给大家做个 HTTPS 系列的教程分享吧,以方便大家及时部署自己博客的 SSL 证书。
今天我们就先从“申请获取免费 SSL 证书”讲起。
“免费”这个概念可以说在中国互联网里绝对是个“烂大街”的玩法了,“免费的永远也是最贵的”都成了众多老网民的普遍认识了。但是,作为博客站长一定要高清楚“营销型免费”和“技术开源型免费”的区别哦,这从根本上还是有很大的区别的,“营销型免费”最终都是为了“填坑”的,“技术开源型免费”有时候才能称得上是真正的“免费”比如,开源的 Linux、开源的 WordPress 等等。这些我们都可以免费安全的使用而不需要支付任何的费用,也不用担心有“坑”需要“填”。那么,说回 SSL 证书,也有“开源免费”的,那就是——Let’s Encrypt SSL 证书。
怎么样,看了上述有关 Let’s Encrypt 的介绍后,是否还鄙视这种“免费”SSL 证书呢?
下面我们就具体的讲述一下利用 Let’s Encrypt 的 ACME 协议在服务器上运用 acme.sh 脚本来申请、管理 SSL 证书(这里明月要强调一下的是 Let’s Encrypt 的 SSL 证书申请是必须要有服务器 root 权限的哦,也就是说必须是 VPS(云主机)才可以的,虚拟主机上是无法申请获取的,但是可以在 VPS(云主机)上申请后部署到虚拟主机上)。
首先我们要先下载 acme.sh 到我们的主机上来,安装命令非常的简单,如下:
- curl https://get.acme.sh | sh
注:必须在 root 权限下运行上述命令哦,切记!切记!切记!
安装方法其实有很多,大家可以参考【更高级的安装选项】里的方法。
把 acme.sh 安装到你的 home 目录下:~/.acme.sh/
并创建 一个 bash 的 alias, 方便你的使用:
- acme.sh=~/.acme.sh/acme.sh
安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中:
- ~/.acme.sh/
acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证.
1、http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.
- acme.sh –issue -d mydomain.com -d www.mydomain.com –webroot /home/wwwroot/mydomain.com/
只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
如果你用的 apache 服务器, acme.sh 还可以智能的从 apache 的配置中自动完成验证, 你不需要指定网站根目录:
- acme.sh –issue -d mydomain.com –apache
如果你用的 nginx 服务器, 或者反代, acme.sh 还可以智能的从 nginx 的配置中自动完成验证, 你不需要指定网站根目录:
- acme.sh –issue -d mydomain.com –nginx
注意, 无论是 apache 还是 nginx 模式, acme.sh 在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏, 也有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问 https. 但是为了安全, 你还是自己手动改配置吧.
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个 webserver, 临时听在 80 端口, 完成验证:
- acme.sh –issue -d mydomain.com –standalone
2、dns 方式, 在域名上添加一条 txt 解析记录, 验证域名所有权.
这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证.
- acme.sh –issue –dns -d mydomain.com
然后, acme.sh 会生成相应的解析记录显示出来, 你只需要在你的域名管理面板中添加这条 txt 记录即可.
等待解析完成之后, 重新生成证书:
- acme.sh –renew -d mydomain.com
注意第二次这里用的是 –renew
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.
以 dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api id 和 api key, 都是免费的. 然后:
- export DP_Id=“1234”
- export DP_Key=“sADDsdasdgdsf”
- acme.sh –issue –dns dns_dp -d aa.com -d www.aa.com
证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:
- acme.sh –issue -d mydomain2.com –dns dns_dp
其他 30 种 API 的接入案例(包括阿里云的 API 接入方式)请移步:How to use DNS API
3、 copy/安装 证书
前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方.
注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件, 例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件. 这里面的文件都是内部使用, 而且目录结构可能会变化.
正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被 copy 到相应的位置, 例如:
- acme.sh –installcert -d mydomain.com \
- –key-file /etc/nginx/ssl/mydomain.key \
- –fullchain-file /etc/nginx/ssl/mydonain.cer \
- –reloadcmd “service nginx force-reload”
(一个小提醒, 这里用的是 service nginx force-reload, 不是 service nginx reload, 据测试, reload 并不会重新加载证书, 所以用的 force-reload)
–installcert 命令可以携带很多参数, 来指定目标文件. 并且可以指定 reloadcmd, 当证书更新以后, reloadcmd 会被自动调用,让服务器生效.
值得注意的是, 这里指定的所有参数都会被自动记录下来, 并在将来证书自动更新以后, 被再次自动调用.
4、更新证书
目前证书在 60 天以后会自动更新, 你无需任何操作. 今后有可能会缩短这个时间, 不过都是自动的, 你不用关心.
5、更新 acme.sh
目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.
升级 acme.sh 到最新版 :
- acme.sh –upgrade
如果你不想手动升级, 可以开启自动升级:
- acme.sh –upgrade –auto-upgrade
之后, acme.sh 就会自动保持更新了.
你也可以随时关闭自动更新:
- acme.sh –upgrade –auto-upgrade 0
好了,到此 acme.sh 的使用基本就是这些了,至于是采用 HTTP 还是 DNS 方式来申请证书?就明月的经验来看,我比较喜欢 DNS 的验证方式,因为这种方式的依赖性最小,更加的灵活,我建议大家都用 DNS 来验证申请 Let’s Encrypt 证书。
当然,acme.sh 还有不少实用的参数可以方便我们来管理已经通过 acme.sh 申请过证书、域名等等,比如:
- acme.sh –list
这个就是列出当前已经申请到证书的域名信息,如下图:
具体的参数,大家可以使用 acme.sh --help
来查看。
其实 acme.sh 的使用还是非常“傻瓜”的,只要照着指令参数做就可以轻松搞定的,上述的示例其实将域名修改为自己的域名就可以用了,其它的也是同样的道理,简单修改一下参数就可以拿来用的。目前,申请获取 Let’s Encrypt 证书有很多种方法,军哥的 LNMP 一键包里也可以直接申请的,网上也有不少申请 Let’s Encrypt 证书的教程,使用的工具可以说是五花八门。但是,就明月的经验来看 acme.sh 这个是最方便、最快捷、最省事儿的,因为使用的就是 Let’s Encrypt 的 ACME 协议,所以兼容性绝对是最可靠的,Shell 脚本式的对系统几乎没有任何依懒性,有很强的自由度。
好了,申请获取 Let’s Encrypt 证书的教程就讲到这里了,后期如果积累新的经验我会第一时间分析给大家的,大家有什么疑问也可以在下面的评论里提出来,明月会一一作答的。