在搭建 Web 服务的时候通常,网站的管理员或者运营商会使用能处理 HTTP 协议的软件进行搭建,例如 Apache 和 Nginx,目前使用最多为 Nginx 搭建的 Web 服务器。Nginx 就是一个实现了 HTTP 协议的软件,能处理浏览器发送到服务器数据包,数据都是经过网络应用层 HTTP 协议传输的,此协议默认情况下是没有对数据包进行加密的,在网络传输中数据包的内容可以被第三方软件截获读取。如果想要对其数据加密传输的话,必须要使用 HTTPS 协议,HTTPS 协议是针对原有的 HTTP 协议改进版本,使用 SSL 和 TLS 针对数据包进行加密的,再在网络上传输的,以此来保证传输的数据包的安全性。但是要做到这一点就的需要使用公钥和私钥,也就是对应的 SSL 证书,怎么获取 SSL 证书呢?目前有很多提供这些服务的 CA 机构,Let’s Encrypt 就是一个免费的提供自动化的开放的证书颁发机构,为公众的利益而运行,它是一项由 Internet Security Research Group(ISRG) 提供的服务。
使用 ACME.SH
ACME.SH 工具能在类 Unix 系统下的命令行中生成证书文件,该工具实现了 ACME 协议并且源代码也是开源的。
安装 acme.sh 很简单,只需要一条命令即可,但是要传入自己的邮箱地址作为申请参数:
curl https://get.acme.sh | sh -s email=your email
默认安装在当前用户的根目录下的隐藏文件中,如果要全局使用最好定义一个别名:
alias acme.sh=~/.acme.sh/acme.sh
在申请域名的 SSL 证书之前,得需要将域名的 DNS 指向到对应的服务器 IP 上,也就是当前执行脚本的服务器上。 ACME.SH 支持提供 DNS 和验证文件的方式进行验证,本文将介绍通过验证文件的方式。使用下面命令的方式进行申请,需要指定域名和网站根目录:
acme.sh --issue -d $WWW_DOMAIN -w /usr/share/nginx/html
默认脚本会自动选择签发证书的 CA 机构,如果想更换 CA 机构可以使用下面命令:
acme.sh --set-default-ca --server zerossl
当程序执行完成之后就提示对于的 SSL 密钥和证书路径,默认在用户对应的根目录下 .acme.sh 目录中,这个目录不能长久保持文件,建议自己单独场景一个文件存放并且设置对于的访问安全权限。Let's Encrypt 的证书有效期为3个月,每3个月得重新申请证书,通过 acme.sh 可以自动管理SSL证书的申请。通过上面步骤的安装后 acme.sh 会定期自动更新SSL证书,也可以手动更新证书,使用命令如下:
acme.sh --renew -d $WWW_DOMAIN --ecc --force
有时候你可能需要移除特定域名的自动申请,这时候可以使用下面的命令让 acme.sh 取消对特定域名的自动续期,已申请的证书仍然有效不会失效,命令如下:
acme.sh --remove -d $WWW_DOMAIN --ecc
至于怎么配置 SSL 证书文件到 Nginx 本文不会介绍,在 Nginx 到安装目录中也很多示例配置文件,改一下就可以。