acme.sh 免费申请 TSL/SSL域名证书

acme.sh 免费申请 SSL/TSL 域名证书

使用 acme.sh 脚本,在Linux服务器上免费申请 TSL /SSL 域名证书

免费申请证书,自动续签配置 acme.sh 脚本,下非常好用的脚本,安装简单,支持方式申请和HTTP方式申请,Let's Encrypt申请十分简单、自动化并且免费。 acme.sh 实现了 acme 协议, 可以从 let‘s encrypt 生成免费的证书。

let's encrypt 和 acme.sh 的简介

什么是 let's encrypt

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

acme.sh 免费申请 SSL/TSL 域名证书

什么是 acme.sh

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

  • 一个纯粹用Shell(Unix shell)语言编写的ACME协议客户端。
  • 完整的 ACME 协议实现。
  • 支持 ECDSA 证书
  • 支持 SAN 和通配符证书
  • 简单,强大且非常易于使用。你只需要3分钟来学习它。
  • Bash,dash和sh兼容。
  • 纯粹用 Shell 编写,不依赖于
  • 只需一个脚本即可自动颁发、续订和安装证书。
  • 不需要访问权限。root/sudoer
  • 码头工人就绪
  • IPv6 就绪
  • 用于续订或错误等的 作业通知。

Github项目主页:https://github.com/acmesh-official/acme.sh

如何安装 acme.sh

实现 ACME 客户端协议的纯 Unix shell 脚本。

安装 acme.sh 脚本

安装很简单, 一个命令:

my@example.com替换成你的Email电子邮箱。

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

将脚本下载到服务器安装:

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

或者,从 git 安装,克隆此项目并启动安装:

git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install -m my@example.com

安装程序将执行 3 个操作:

  • 创建并复制到您的主页目录 ():。 所有证书也将放在此文件夹中。acme.sh$HOME~/.acme.sh/
  • 为以下内容创建别名:acme.sh=~/.acme.sh/acme.sh
  • 创建每日 cron 作业以根据需要检查和续订证书。

配置 acme.sh 脚本

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

alias acme.sh=~/.acme.sh/acme.sh
echo 'alias acme.sh=~/.acme.sh/acme.sh' >>/etc/profile

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

00 00 * * * root /root/.acme.sh/acme.sh --cron --home /root/.acme.sh &>/var/log/acme.sh.logs

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

使用 acme.sh 申请证书

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

HTTP 方式

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

下面以域名uzbox.com为例:

acme.sh --issue -d uzbox.com -d *.uzbox.com --webroot /www/wwwroot/uzbox.com/

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

acme.sh --issue -d uzbox.com --uzbox.com

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

acme.sh --issue -d uzbox.com --nginx

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

acme.sh --issue -d uzbox.com --standalone

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

DNS方式

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

DNS方式申请证书

cd /root/.acme.sh
acme.sh --issue -d *.uzbox.com -d uzbox.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

修改DNS,在NS管理方修改主机记录。

DNS方式生成证书

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

acme.sh --renew -d *.uzbox.com -d uzbox.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

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

dns 方式API

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

export DP_Id="xxxxxxxxxxx"
export DP_Key="xxxxxxxxxxxxxx"
acme.sh --issue --dns dns_dp -d uzbox.com -d www.uzbox.com

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

acme.sh --issue -d uzbox.com --dns dns_dp

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

TLS/SSL 证书的使用

TLS/SSL证书安装

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

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

acme.sh --installcert -d uzbox.com \
--key-file /etc/nginx/ssl/uzbox.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "systemctl force-reload nginx"

Nginx服务器安装SSL证书

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

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

server {
listen 443;
server_name uzbox.com;
ssl on;
root html;
index index.html index.htm;
ssl_certificate /www/server/panel/vhost/cert/uzbox.com/fullchain.cer;
ssl_certificate_key /www/server/panel/vhost/cert/uzbox.com/clsn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}

重启nginx,加载新配置

systemctl force-reload nginx

注意:这里用的是 systemctl force-reload nginx,不是 systemctl reload nginx,reload 并不会重新加载证书,所以用的 force-reload。

更新证书

证书的更新

目前证书有效期是90天,在 60 天以后会通过自动更新,你无需任何操作。都是自动的,你不用担心证书失效的问题。

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
参考文献
评分

留下评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注