<span class="log-zd"><span class="log-close"><a title="隐藏目录"><i class="be be-cross"></i><strong>目录</strong></a></span></span>

1.关于let’s encrypt和acme.sh的简介

1.1 let’s encrypt

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

1.2 acme.sh

简单来说acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。
acme.sh 有以下特点:

  • 一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端。
  • 完整的ACME协议实施。 支持ACME v1和ACME v2 支持ACME v2通配符证书
  • 简单,功能强大且易于使用。你只需要3分钟就可以学习它。
  • Let’s Encrypt免费证书客户端最简单的shell脚本。
  • 纯粹用Shell编写,不依赖于python或官方的Let’s Encrypt客户端。
  • 只需一个脚本即可自动颁发,续订和安装证书。 不需要root/sudoer访问权限。
  • 支持在Docker内使用,支持IPv6

2.安装acme.sh

2.1 执行安装

https://github.com/Neilpang/acme.sh/wiki/dns-manual-mode
安装很简单, 一个命令:

脚本会根据系统不通选择不同的下载方式:

2.2 安装后的配置

普通用户和 root 用户都可以安装使用。
安装过程进行了以下几步:
把 acme.sh 安装到你的 home 目录下:~/.acme.sh/并创建 一个 bash 的 alias, 方便你的使用:

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

更高级的安装选项请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-install
在该脚本的安装过程不会污染已有的系统任何功能和文件, 所有的修改都限制在安装目录中: ~/.acme.sh/

3.申请证书

acme.sh 实现了 acme 协议支持的所有验证协议. 一般有两种方式验证: http 和 dns 验证。

3.1 HTTP 方式

http 方式需要在你的网站根目录下放置一个文件, 来验证你的域名所有权,完成验证. 然后就可以生成证书了.

只需要指定域名, 并指定域名所在的网站根目录. acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证. 最后会聪明的删除验证文件. 整个过程没有任何副作用.
如果你用的 apache服务器, acme.sh 还可以智能的从 apache的配置中自动完成验证, 你不需要指定网站根目录:

如果你用的 nginx服务器, 或者反代, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 你不需要指定网站根目录:

注意, 无论是 apache 还是 nginx 模式, acme.sh在完成验证之后, 会恢复到之前的状态, 都不会私自更改你本身的配置. 好处是你不用担心配置被搞坏。
该类型的配置有一个缺点, 你需要自己配置 ssl 的配置, 否则只能成功生成证书, 你的网站还是无法访问https. 但是为了安全, 你还是自己手动改配置吧.
如果你还没有运行任何 web 服务, 80 端口是空闲的, 那么 acme.sh 还能假装自己是一个webserver, 临时听在80 端口, 完成验证:

更高级的用法请参考: https://github.com/Neilpang/acme.sh/wiki/How-to-issue-a-cert

3.2 DNS方式

这种方式的好处是, 你不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证。
这种方式的缺点是,如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权。

3.2.1 颁发证书

3.2.2 修改DNS

在NS管理方修改主机记录

####

3.2.3 验证解析是否生效

3.2.4 生成证书

获取Let’s Encrypt免费泛域名证书。等DNS解析生效后,运行以下命令重新生成证书:

注意第二次这里用的是 –renew

3.2.5 dns 方式API

dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证.
acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成.
以 dnspod 为例, 你需要先登录到 dnspod 账号, 生成你的 api id 和 api key, 都是免费的. 然后:

证书就会自动生成了. 这里给出的 api id 和 api key 会被自动记录下来, 将来你在使用 dnspod api 的时候, 就不需要再次指定了. 直接生成就好了:

更详细的 api 用法: https://github.com/Neilpang/acme.sh/blob/master/dnsapi/README.md

4.证书的使用

4.1 安装证书

前面证书生成以后, 接下来需要把证书 copy 到真正需要用它的地方。

注意, 默认生成的证书都放在安装目录下: ~/.acme.sh/, 请不要直接使用此目录下的文件,
例如: 不要直接让 nginx/apache 的配置文件使用这下面的文件.
这里面的文件都是内部使用, 而且目录结构可能会变化.正确的使用方法是使用 –installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置, 例如:

4.2 Nginx/Tengine服务器安装SSL证书

以Nginx标准配置为例,生成的证书文件推荐使用 fullchain.cer,私钥文件为是clsn.io.key。

Nginx 的配置 ssl_certificate 使用 fullchain.cer ,而非 .cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误。
(1)通过上述中生成的证书路径为/www/server/panel/vhost/cert/clsn.io/;
修改配置文件

(2)重启nginx

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

5.更新

5.1 证书的更新

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

5.2 acme.sh 更新

目前由于 acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步.
升级 acme.sh 到最新版 :

如果你不想手动升级, 可以开启自动升级:

之后, acme.sh 就会自动保持更新了.
你也可以随时关闭自动更新:

6.参考文献

https://letsencrypt.org/
https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E

<li>
  <a href="#2acmesh">2.安装acme.sh</a><ul>
    <li>
      <a href="#21">2.1 执行安装</a>
    </li>
    <li>
      <a href="#22">2.2 安装后的配置</a>
    </li>
  </ul>
</li>

<li>
  <a href="#3">3.申请证书</a><ul>
    <li>
      <a href="#31_HTTP">3.1 HTTP 方式</a>
    </li>
    <li>
      <a href="#32_DNS">3.2 DNS方式</a><ul>
        <li>
          <a href="#321">3.2.1 颁发证书</a>
        </li>
        <li>
          <a href="#322_DNS">3.2.2 修改DNS</a>
        </li>
        <li>
          <a href="#324">3.2.4 生成证书</a>
        </li>
        <li>
          <a href="#325_dns_API">3.2.5 dns 方式API</a>
        </li>
      </ul>
    </li>
  </ul>
</li>

<li>
  <a href="#4">4.证书的使用</a><ul>
    <li>
      <a href="#41">4.1 安装证书</a>
    </li>
    <li>
      <a href="#42_NginxTengineSSL">4.2 Nginx/Tengine服务器安装SSL证书</a>
    </li>
  </ul>
</li>

<li>
  <a href="#5">5.更新</a><ul>
    <li>
      <a href="#51">5.1 证书的更新</a>
    </li>
    <li>
      <a href="#52_acmesh">5.2 acme.sh 更新</a>
    </li>
    <li>
      <a href="#6">6.参考文献</a>
    </li>
  </ul>
</li>