# 使用 acme.sh 申请免费自动续期的 SSL 证书

# 1、SSL/TLS 简介

传输层安全性协议(英语:Transport Layer Security,缩写:TLS)及其前身安全套接层(英语:Secure Sockets Layer,缩写:SSL)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障。网景公司(Netscape)在1994年推出首版网页浏览器-网景导航者时,推出 HTTPS 协议,以 SSL 进行加密,这是 SSL 的起源。IETF 将 SSL 进行标准化,1999 年公布 TLS 1.0 标准文件(RFC 2246)。随后又公布 TLS 1.1(RFC 4346,2006年)、TLS 1.2(RFC 5246,2008年)和 TLS 1.3(RFC 8446,2018年)。查看更多 (opens new window)

# 2、Let’s Encrypt

Layer 1

Let's Encrypt 是一个于 2015 年三季度推出的数字证书认证机构,旨在以自动化流程消除手动创建和安装证书的复杂流程,并推广使万维网服务器的加密连接无所不在,为安全网站提供免费的 SSL/TLS 证书。 Let's Encrypt 由互联网安全研究小组(缩写ISRG)提供服务。主要赞助商包括电子前哨基金会、Mozilla 基金会、Akamai 以及思科。2015 年 4 月 9 日,ISRG 与 Linux 基金会宣布合作。 用以实现新的数字证书认证机构的协议被称为自动证书管理环境(ACME)。GitHub 上有这一规范的草案,且提案的一个版本已作为一个 Internet 草案发布。 Let's Encrypt 宣称这一过程将十分简单、自动化并且免费。查看更多 (opens new window)

# 3、为什么使用 acme.sh ?

SSL/HTTPS 从诞生发展至今,已经非常普及,并且免费证书也很容易获得,国内阿里云、腾讯云等都有免费提供 SSL 证书服务,这里为什么还要使用 acme.sh ?

Let’s Encrypt 提供很多方式,网上也有不少教程,但是操作都不是很方便,下面介绍使用的这款国人写的开源脚本 acme.sh (opens new window), 实现了 SSL 证书自动申请,自动续期。非常方便!

# 4、环境准备

  • 有公网 IP 的 VPS 主机(虚拟机不可)

  • CentOS 7 操作系统

  • 自有域名

# 5、使用 acme.sh 安装 Let’s Encrypt 证书

# 5.1 安装 acme.sh

curl https://get.acme.sh | sh -s email=my@example.com

普通用户和 root 用户都可以安装使用,安装过程进行了以下几步:

  1. acme.sh 安装到你的 home 目录下:~/.acme.sh/

    并创建了一个 bash 的 alias, 方便你的使用:alias acme.sh=~/.acme.sh/acme.sh

  2. 自动为你创建 cronjob, 每天 0:00 点自动检测所有的证书,如果快过期了,需要更新,则会自动更新证书。

安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录中:~/.acme.sh/

# 5.2 生成证书

acme.sh 实现了 acme 协议支持的所有验证协议,这里介绍比较常见的通过 http 验证方式生成证书。http 验证方式需要确保 Let’s Encrypt 能访问 80 端口下的 /.well-known/acme-challenge 目录,我们以 Nginx 为例。

安装并启动 Nginx Web 服务,参考:Nginx 编译安装,支持 HTTPS

将自有域名解析到 VPS 主机的公网 IP, 保证通过域名能访问到 Nginx 服务。

新建一个目录 /var/www/letsencrypt 用于存放 80 端口下 Let’s Encrypt 的临时验证文件:

mkdir -p /var/www/letsencrypt

一般安装了 SSL 以后很多用户选择 http 跳转到 https,所以修改 Nginx 配置如下:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    location /.well-known/acme-challenge {
        root /var/www/letsencrypt;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

上面配置的意思是所有访问 80 端口的请求,都自动跳转到 https ,但是 /.well-known/acme-challenge 这个目录仍然可以通过 80 端口进行访问。

检查配置并重启 Nginx :

/usr/local/nginx/sbin/nginx -t && systemctl reload nginx

接下来使用 acme.sh 给自有域名签发证书,我这里以个人二级域名 api.huangxulin.cn 作为演示。

acme.sh --issue -d api.huangxulin.cn --webroot /var/www/letsencrypt

这里只需要指定域名和域名所在网站的根目录,acme.sh 会全自动的生成验证文件,并放到网站的根目录,然后自动完成验证。最后还会聪明的删除验证文件。整个过程没有任何副作用。

# 5.3 安装证书

为了方便维护,我们新建一个目录 /usr/local/nginx/ssl 用来存放证书:

mkdir -p /usr/local/nginx/ssl

使用 acme.sh 安装证书:

acme.sh --install-cert -d api.huangxulin.cn \
--key-file /usr/local/nginx/ssl/key.pem  \
--fullchain-file /usr/local/nginx/ssl/cert.pem \
--reloadcmd "service nginx force-reload"

小提示

  1. 这里用的是 service nginx force-reload ,不是 service nginx reload ,据测试,reload 并不会重新加载证书,所以用的 force-reload.

  2. 这里指定的所有参数都会被自动记录下来,并在将来证书自动更新以后,被再次自动调用。

# 5.4 配置 Nginx HTTPS 访问

生成 dhparam.pem 文件

openssl dhparam -out /usr/local/nginx/ssl/dhparam.pem 2048
server {
    listen       443 ssl;
    server_name  api.huangxulin.cn;

    ssl_dhparam  /usr/local/nginx/ssl/dhparam.pem;
    ssl_protocols TLSv1.2;

    ssl_certificate      /usr/local/nginx/ssl/cert.pem;
    ssl_certificate_key  /usr/local/nginx/ssl/key.pem;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

检查配置并重启 Nginx :

/usr/local/nginx/sbin/nginx -t && systemctl reload nginx

# 5.5 验证 SSL

访问 ssllabs.com 输入你的域名,检查 SSL 的配置是否都正常:

https://www.ssllabs.com/ssltest/analyze.html?d=api.huangxulin.cn (opens new window)

确保验证结果有 A 以上,否则根据提示调整问题。

cert-info.png

# 5.6 查看证书信息

  1. 浏览器访问域名:http://api.huangxulin.cn (opens new window) ,会自动跳转到 https 的站点。

  2. 可以看到浏览器地址栏前面会出现一把锁,点击可查看证书信息如下:

cert-info.png

# 5.7 更新证书

目前证书在 60 天以后会自动更新,你无需任何操作。今后有可能会缩短这个时间,不过都是自动的,你不用关心。

可以使用以下命令测试一下更新流程,看看能否正确执行:

acme.sh --cron -f

# 5.8 更新 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

# 5.9 更多用法

https://github.com/acmesh-official/acme.sh/wiki/说明 (opens new window)

# 6、引用

以下网站、博文等信息对本文有很大参考价值,在此感谢。