如何使用acme.sh自动获取、更新Let’s Encrypt的SSL证书?

8,099次阅读
没有评论

共计 3135 个字符,预计需要花费 8 分钟才能阅读完成。

acme.sh 实现了 acme 协议,可以从 let’s encrypt 生成免费的 ssl 证书。本文主要记录使用 dnspod api 自动申请 ssl 证书

站点 HTTPS 检测:https://myssl.com/

安装

打包下载仓库的代码(https://github.com/acmesh-official/acme.sh),上传到服务器(任意自己觉得合适的目录),命令行安装:

cd 上传目录
# acmh.sh 文件需要可执行的权限
./acme.sh --install --home /home/ssl-auto/acme --config-home /home/ssl-auto/acme --cert-home /home/ssl-auto/acme/ssl
  • –home,是要安装的自定义目录 acme.sh。默认情况下,它安装到~/.acme.sh
  • –config-home,是一个可写文件夹,acme.sh 会将所有文件(包括证书 / 密钥、配置)写入那里。默认情况下,它在 –home
  • –cert-home,是一个自定义目录,用于保存您颁发的证书。默认情况下,它保存在 –config-home.
  • –accountemail,是用于注册 Let’s Encrypt 帐户的电子邮件,您将在此处收到续订通知电子邮件。
  • –accountkey,是保存您的帐户私钥的文件。默认情况下,它保存在 –config-home.
  • –user-agent,是用于发送到 Let’s Encrypt 的用户代理标头值。
  • –nocron,在没有 cronjob 的情况下安装 acme.sh

不指定任何参数时,默认安装在用户目录(登录的 root,就在 root 目录,因为 root 的用户目录在 root 目录);

安装过程不会污染现有系统的任何功能和文件,所有修改都限制在安装目录中,安装后会自动添加一个自动更新证书的定时任务。

16 0 * * * "/home/ssl-auto/acme"/acme.sh --cron --home "/home/ssl-auto/acme" > /home/ssl-auto/log.txt

生成的定时任务默认不保存日志,可修改 > 后的路径,保存每次更新的日志;

参考文档:https://github.com/acmesh-official/acme.sh/wiki/How-to-install

使用前的配置

1. 帐户注册

ZeroSSL 没有速率限制。可以颁发有效期为 90 天的无限 TLS/SSL 证书(参考),由于 v3,acme.sh 使用 Zerossl 作为默认证书颁发机构 (CA)。在颁发新证书之前需要进行帐户注册(一次性)。另见:https://github.com/acmesh-official/acme.sh/wiki/Change-default-CA-to-ZeroSSL

cd 安装目录
./acme.sh --register-account -m 1747111677@qq.com

2. 获取 dnspod 的 api 秘钥

相关文档:https://github.com/acmesh-official/acme.sh/wiki/How-to-issue-a-cert

# 申请之前,设置 api 参数
export DP_Id="350225"
export DP_Key="6412bd76*********fd9137def26"

除了 dnspod 之外还支持很多其他的域名服务商,从上方文档可以查询操作方法;

申请证书

# 申请证书
./acme.sh --issue --dns dns_dp -d tele.nicen.cn

大功告成,证书生成目录下已经有了我们需要的证书文件

复制粘贴证书时,不能有多余的空格、空行

如果报错了,可以在仓库的 issue 内用报错信息搜索一下,看有没有相关的问题,如果没有可以编辑打开 acme.sh,搜索报错信息,然后分析一下上下文,找出问题所在;

  • cert.pem –服务器端证书
  • chain.pem –根证书和中继证书
  • fullchain.pem – Nginx 所需要 ssl_certificate 文件
  • privkey.pem – 安全证书 KEY 文件

提示

官方说明写的 pem,但实际我申请到的是 cer 格式的文件

目前 acme.sh 支持 Let’s Encrypt、Buypass、ZeroSSL、SSL.com 和 Google Public CA,默认使用 ZeroSSL,如果需要更换可以使用下面命令:

 切换 Let's Encrypt
acme.sh --set-default-ca --server letsencrypt
切换 Buypass
acme.sh --set-default-ca --server buypass
切换 ZeroSSL
acme.sh --set-default-ca --server zerossl
切换 SSL.com
acme.sh --set-default-ca --server ssl.com
切换 Google Public CA
acme.sh --set-default-ca --server google

知识总结

1.Strict-Transport-Security

HSTS 的作用是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接。服务器开启 HSTS 的方法是,当客户端通过 HTTPS 发出请求时,在服务器返回的超文本传输协议响应头中包含 Strict-Transport-Security 字段。非加密传输时设置的 HSTS 字段无效。

HSTS 可以用来抵御 SSL 剥离攻击。SSL 剥离攻击是中间人攻击的一种,由 Moxie Marlinspike 于 2009 年发明。他在当年的黑帽大会上发表的题为“New Tricks For Defeating SSL In Practice”的演讲中将这种攻击方式公开。SSL 剥离的实施方法是阻止浏览器与服务器创建 HTTPS 连接。它的前提是用户很少直接在地址栏输入 https://,用户总是通过点击链接或 3xx 重定向,从 HTTP 页面进入 HTTPS 页面。所以攻击者可以在用户访问 HTTP 页面时替换所有 https:// 开头的链接为 http://,达到阻止 HTTPS 的目的。

HSTS 可以很大程度上解决 SSL 剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用 HTTPS,即使链接被换成了 HTTP

另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告。HSTS 解决了这一问题,一旦服务器发送了 HSTS 字段,用户将不再允许忽略警告。

Nginx 配置如下,Strict-Transport-Security 中的 max-age 的时间不能小于 15552000:

add_header Strict-Transport-Security "max-age=31536000";

问题总结

1. 各类证书与密钥文件后缀的解释

从文件编码上分,证书只有两大类:

  • PEM 格式:使用 Base64 ASCII 进行编码的纯文本格式
  • DER 格式:二机制格式

CRT, CER,KEY 这几种证书和密钥文件,它们都有自己的 schema,在存储为物理文件时,既可以是 PEM 格式,也可以 DER 格式。

  • CER:一般用于 windows 的证书文件格式
  • CRT:一般用于 Linux 的证书,包含公钥和主体信息
  • KEY:一般用于密钥,特别是私钥

Certificate Signing Request,即证书签名请求文件。证书申请者在生成私钥的同时也生成证书请求文件。把 CSR 文件提交给证书颁发机构后,证书颁发机构使用其根证书私钥签名就生成了证书公钥文件,也就是颁发给用户的证书。CER,CRT,KEY 相当于论文,说明书等,有规定好的行文格式与规范,而 PEM 和 DER 相当于 txt 格式还是 word 格式。

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-10发表,共计3135字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)