基于Let's Encrypt生成免费证书-支持多域名泛域名证书
Let’s Encrypt是一个由非营利性组织互联网安全研究小组(ISRG)提供的免费、自动化和开放的证书颁发机构(CA)。
简单的说,借助Let’s Encrypt颁发的证书可以为我们的网站免费启用HTTPS(SSL/TLS)
客户端
Let’s Encrypt 使用 ACME 协议来验证您对给定域名的控制权并向您颁发证书。要获得 Let’s Encrypt 证书,您需要选择一个要使用的 ACME 客户端软件。Let’s Encrypt 不控制或审查第三方客户端,也不能保证其安全性或可靠性。
官方提供了几种证书的申请方式方法
certbot
它既可以仅为您获取证书,也可以帮助您安装证书(如果您需要的话)。它易于使用,适用于许多操作系统,并且具有出色的文档。
acme.sh
目前 Let's Encrypt 免费证书客户端最简单、最智能的 shell 脚本,可以自动发布和续订 Let's Encrypt 中的免费证书
安装acme.sh
1. 自动安装
curl https://get.acme.sh | sh (网络问题可能失败)
2. 手动安装
git clone https://github.com/acmesh-official/acme.sh.git
cd ./acme.sh
./acme.sh --install
安装过程如下:
默认安装到当前用户的主目录$HOME下的.acme.sh文件夹中,即
~/.acme.sh/,之后所有生成的证书也会按照域名放在这个目录下;创建指令别名: alias acme.sh=~/.acme.sh/acme.sh, 通过
acme.sh命令方便快速地使用 acme.sh 脚本自动创建cronjob定时任务,每天 0:00 点自动检测所有的证书,如果快过期了,则会自动更新证书
#每天 0:00 点自动检测所有的证书, 如果快过期了, 需要更新, 则会自动更新证书
0 0 * * * /root/.acme.sh/acme.sh --cron --home /root/.acme.sh > /dev/null
3. 测试收否安装成功
user@owen-ubuntu:~$ acme.sh --version
https://github.com/acmesh-official/acme.sh
v2.8.8
如有版本信息输出则表示环境正常;如果提示命令未找到,执行source ~/.bashrc命令重载一下环境配置文件。
整个安装过程不会污染已有的系统任何功能和文件,所有的修改都限制在安装目录~/.acme.sh/中。
使用acme.sh生成证书
1. HTTP 方式
http 方式需要在你的网站根目录下放置一个文件, 以此来验证你的域名所有权,完成验证,只需要指定域名, 并指定域名所在的网站根目录,acme.sh 会全自动的生成验证文件, 并放到网站的根目录, 然后自动完成验证,该方式较适合独立域名的站点使用,比如博客站点等
./acme.sh --issue -d mydomain.com -d www.mydomain.com --webroot /home/wwwroot/mydomain.com/
- issue 是acme.sh脚本用来颁发证书的指令;
- d是 --domain的简称,其后面须填写已备案的域名;
- w是 --webroot的简称,其后面须填写网站的根目录。
示例:
./acme.sh --issue -d devopsing.site -d www.devopsing.site --webroot /var/www/html/blog/
证书签发成功会有如下输出:

执行成功,默认为生成如下证书:
root@ecs-ubuntu18:/etc/nginx/sites-available# ls ~/.acme.sh/devopsing.site/ -l
total 28
-rw-r--r-- 1 root root 1587 Dec 16 12:34 ca.cer
-rw-r--r-- 1 root root 1866 Dec 16 12:34 devopsing.site.cer
-rw-r--r-- 1 root root 642 Dec 16 12:34 devopsing.site.conf
-rw-r--r-- 1 root root 1001 Dec 16 12:33 devopsing.site.csr
-rw-r--r-- 1 root root 232 Dec 16 12:33 devopsing.site.csr.conf
-rw-r--r-- 1 root root 1679 Dec 16 12:33 devopsing.site.key
-rw-r--r-- 1 root root 3453 Dec 16 12:34 fullchain.cer
如果用的apache/nginx服务器, acme.sh 还可以智能的从 nginx的配置中自动完成验证, 不需要指定网站根目录:
acme.sh --issue -d mydomain.com --apache
acme.sh --issue -d mydomain.com --nginx
2. DNS 方式
适合用于生成范解析证书
优势:不需要任何服务器, 不需要任何公网 ip, 只需要 dns 的解析记录即可完成验证
劣势:如果不同时配置 Automatic DNS API,使用这种方式 acme.sh 将无法自动更新证书,每次都需要手动再次重新解析验证域名所有权`
1. 生成证书记录
注意,第一次执行时使用 --issue,-d 指定需要生成证书的域名
./acme.sh --issue -d *.example.com --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please
参数解释:
--dns [dns_hook] Use dns manual mode or dns api. Defaults to manual mode when argument is omitted.
--yes-I-know-dns-manual-mode-enough-go-ahead-please Force use of dns manual mode.
See: https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode
2. 在域名解析中手动添加TXT记录
如果第一次添加该域名,会提示如下信息,需要在DNS解析中添加TXT记录,用作判断你是否拥有域名使用权
[Wed Dec 16 16:04:49 CST 2020] Add the following TXT record:
[Wed Dec 16 16:04:49 CST 2020] Domain: '_acme-challenge.devopsing.site'
[Wed Dec 16 16:04:49 CST 2020] TXT value: '-jEWdpI**************EVh01_a3ywrW426wmppjuDqXOs'
[Wed Dec 16 16:04:49 CST 2020] Please be aware that you prepend _acme-challenge. before your domain
[Wed Dec 16 16:04:49 CST 2020] so the resulting subdomain will be: _acme-challenge.devopsing.site
[Wed Dec 16 16:04:49 CST 2020] Please add the TXT records to the domains, and re-run with --renew.
[Wed Dec 16 16:04:49 CST 2020] Please add '--debug' or '--log' to check more details.
[Wed Dec 16 16:04:49 CST 2020] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

验证解析生效
user@owen-ubuntu:~$ nslookup -q=TXT _acme-challenge.devopsing.site
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
_acme-challenge.devopsing.site text = "-jEWdpI****************1_a3ywrW426wmppjuDqXOs"
Authoritative answers can be found from:
3. 重新生成证书
注意,这里第二次执行是用的是 --renew
./acme.sh --renew -d *.example.com --yes-I-know-dns-manual-mode-enough-go-ahead-please
示例:
./acme.sh --issue -d *.devopsing.site --dns --yes-I-know-dns-manual-mode-enough-go-ahead-please

root@ecs-ubuntu18:/var/log/nginx# ls ~/.acme.sh/\*.devopsing.site/ -l
total 28
-rw-r--r-- 1 root root 1587 Dec 16 16:09 ca.cer
-rw-r--r-- 1 root root 1846 Dec 16 16:09 '*.devopsing.site.cer'
-rw-r--r-- 1 root root 613 Dec 16 16:09 '*.devopsing.site.conf'
-rw-r--r-- 1 root root 980 Dec 16 16:09 '*.devopsing.site.csr'
-rw-r--r-- 1 root root 211 Dec 16 16:09 '*.devopsing.site.csr.conf'
-rw-r--r-- 1 root root 1679 Dec 16 16:04 '*.devopsing.site.key'
-rw-r--r-- 1 root root 3433 Dec 16 16:09 fullchain.cer
4. 使用DNS API的模式进行证书申请 (支持自动更新)
dns 方式的真正强大之处在于可以使用域名解析商提供的 api 自动添加 txt 记录完成验证,acme.sh 目前支持 cloudflare, dnspod, cloudxns, godaddy 以及 ovh 等数十种解析商的自动集成。
阿里云DNS API
首先获取阿里云的操作API 的 AccessKey ID和AccessKey Secret
export Ali_Key="key值"
export Ali_Secret="key Secret"
# 给出的 api id 和 api key 会被自动记录下,下次就不用再次执行上述命令
acme.sh --issue --dns dns_ali -d *.example.com --force
示例:
export Ali_Key="LTAI4FyrEoJi8qEeKeRios2r"
export Ali_Secret="nIpymix0sYSj6a0bJNgERE0QzjSrkF"
acme.sh --issue --dns dns_ali -d *.devopsing.site --force
DnsPod API
export DP_Id="1234"
export DP_Key="sADDsdasdgdsf"
acme.sh --issue --dns dns_dp -d *.example.com
查看/删除证书
查看安装证书 acme.sh --list

删除证书 acme.sh remove <SAN_Domains>
user@ecs-ubuntu18:~$ acme.sh remove devopsing.site
[Thu Dec 17 14:05:53 CST 2020] devopsing.site is removed, the key and cert files are in /home/user/.acme.sh/devopsing.site
[Thu Dec 17 14:05:53 CST 2020] You can remove them by yourself.
使用acme.sh安装证书
上面生成的证书放在了~/.acem.sh/<domain>目录,使用--installcert命令,指定目标位置,可将证书copy 到相应的位置
Nginx 示例
acme.sh --installcert -d <domain>.com \
--key-file /etc/nginx/ssl/<domain>.key \
--fullchain-file /etc/nginx/ssl/fullchain.cer \
--reloadcmd "service nginx force-reload"
如果要直接加载配置,可以使用 --reloadcmd "service nginx force-reload",但是由于nginx 的配置可能不尽相同,所以一般选择手动 reload nginx
注意:Nginx 的配置 ssl_certificate 使用 /etc/nginx/ssl/fullchain.cer ,而非 /etc/nginx/ssl/.cer ,否则 SSL Labs 的测试会报 Chain issues Incomplete 错误
server {
listen 443 ssl;
server_name demo.com;
ssl on;
ssl_certificate /etc/nginx/ssl/fullchain.cer;
ssl_certificate_key /etc/nginx/ssl/<domain>.key;
Apache 示例
./acme.sh --install-cert -d *.example.com
--cert-file /path/to/certfile/in/apache/cert.pem
--key-file /path/to/keyfile/in/apache/key.pem
--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem
--reloadcmd "service apache2 force-reload"
更新证书
目前 Let's Encrypt 的证书有效期是90天,时间到了会自动更新,无需任何操作。但是,也可以强制续签证书:
acme.sh --renew -d example.com --force
注:手动添加DNS获取证书的方式无法自动更新,但是使用DNS API的方式进行获取证书可以在证书有效期后自动更新, 你无需任何操作
强制执行更新任务 acme.sh --cron -f

更新acme.sh
acme 协议和 letsencrypt CA 都在频繁的更新, 因此 acme.sh 也经常更新以保持同步。
手动更新: acme.sh --upgrade
开启自动更新:acme.sh --upgrade --auto-upgrade
取消自动更新: acme.sh --upgrade --auto-upgrade 0
删除acme.sh
user@owen-ubuntu:~$ acme.sh --uninstall
[2020年 12月 18日 星期五 15:55:11 CST] Removing cron job
[2020年 12月 18日 星期五 15:55:11 CST] LE_WORKING_DIR='/home/user/.acme.sh'
[2020年 12月 18日 星期五 15:55:11 CST] Uninstalling alias from: '/home/user/.bashrc'
[2020年 12月 18日 星期五 15:55:11 CST] The keys and certs are in "/home/user/.acme.sh", you can remove them by yourself.
基于Let's Encrypt生成免费证书-支持多域名泛域名证书的更多相关文章
- 使用Let's Encrypt生成免费SSL证书操作记录
最近要做微信小程序,要求接口必须备案且是https,个人小站就直接准备使用免费的SSL证书,网上搜了一圈,发现Let's Encrypt是浏览器支持比较好的. 流程: 1. 首先去服务器上安装了Let ...
- 使用Let's Encrypt 生成免费的ssl证书的详细过程
参考连接:https://github.com/diafygi/acme-tiny 中文:https://hacpai.com/article/1487899289204 目前我了解可以生成免费证书的 ...
- Nginx 实现全站 HTTPS(基于 Let's Encrypt 的免费通配符证书)
单域名证书的生成可以 参考这里. acme.sh 项目中文文档 Let's Encrypt 在 18 年 1 月份推出了 ACME v2,支持通配符域名证书,对小网站.个人站长的友好度进一步增加. 常 ...
- 使用Let’s Encrypt生成免费的SSL证书
SSL(安全套接层,Secure Sockets Layer),及其继任者 TLS (传输层安全,Transport Layer Security)是为网络通信提供安全及数据完整性的一种安全协议.TL ...
- Nginx 实现 HTTPS(基于 Let's Encrypt 的免费证书)
SSL / TLS加密会为您的用户带来更高的搜索排名和更好的安全性. Let’s Encrypt 是一个认证机构(CA).它可以提供免费证书,并且已经被大多数浏览器所信任.另外,通过工具 Certbo ...
- 生成免费SSL通配证书
通过Let's Encrypt 生成免费SSL证书 有效期是3个月 1.下载工具certbot-auto wget https://dl.eff.org/certbot-auto chmod +x c ...
- 基于数据库的自动化生成工具,自动生成JavaBean、自动生成数据库文档等(v4.1.2版)
目录: 第1版:http://blog.csdn.net/vipbooks/article/details/51912143 第2版:htt ...
- 生成线上用https证书,支持通配符和多域名,初学Let’s Encrypt用于IIS,纯本地手动
自简书发布的上篇<生成本地测试用https证书,支持通配符和多域名,初学OpenSSL>以来,本地测试用https用的妥妥的. 线上一直用的腾讯云的免费证书(每个域名都要一个证书(滑稽), ...
- CentOS 7配置Let’s Encrypt支持免费泛域名证书
Let’s Encrypt从2018年开始支持泛域名证书,有效期3个月,目前仅支持acme方式申请,暂不支持certbot. 1.安装acme.sh curl https://get.acme.sh ...
随机推荐
- JZOJ 2020.10.6 【NOIP2017提高A组模拟9.7】陶陶摘苹果
陶陶摘苹果 题目 Description Input Output Sample Input 10 5 110 3 100 200 150 140 129 134 167 198 200 111 0 ...
- day1(Django)
1,web项目工作流程 1.1 了解web程序工作流程 1.2 django生命周期 2,django介绍 目的:了解Django框架的作用和特点作用: 简便.快速的开发数据库驱动的网站 Djan ...
- Kafak探究之路- 内部结构小结
1.框架与工作流 2 内部结构 kafka的每个主题分区的数据在 first-0(主题名-分区号)文件夹下,保存 n组xxx.log文件与xxx.index文件.log文件存发送消息的元数据,每个大小 ...
- 第5章函数进阶 第5.1节 Python函数的位置参数、关键字参数精讲
前面第二章简单介绍了函数定义的语法,经过后面一系列的学习,函数有必要再次介绍一下相关内容. 一. 关于函数的语法 1. 语法 def 函数名([参数]): 函数文档字符串 函数体 ...
- Python文件操作函数os.open、io.open、内置函数open之间的关系
Python提供了多种文件操作方式,这里简单介绍os.open.io.open.内置函数open之间的关系: 一.内置函数open和io.open实际上是同一个函数,后者是前者的别名: 二.os.op ...
- Android开源项目分类汇总-转载
太长了,还是转载吧...今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有参 ...
- DVWA各等级sql注入
sql全等级注入 level:low <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { //判断submit是否存在 // Get input $id = ...
- Pytest 系列(27)- allure 命令行参数
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 先看看 allure 命令的帮助文 ...
- axios 封装 跨域 实现 (后端跨域配置白名单)
1. 始vue化项目 vue init webpack deaxios # 使用脚手架创建项目 deaxios(项目名,随便取得) cd deaxios # 进入项目cnpm install npm ...
- 系统类 字符串String类
java编程语言中的字符串. 在java中,String类是不可变的,对String类的任何改变,都是返回一个新的String类对象. String 对象是 System.Char 对象的有序集合,用 ...