使用acme.sh 签发SSL证书

@(Nginx)

使用acme.sh 签发SSL证书

背景:

域名服务商: 阿里云
SSL证书使用场景: Nginx ,Tomcat

安装acme.sh

国内由于墙的问题,建议用gitee的镜像库克隆

mkdir /usr/local/acme
cd  /usr/local/acme
git clone https://gitee.com/neilpang/acme.sh.git
cd acme.sh
./acme.sh --install -m 你有有效邮箱

安装成功后显示以下内容:

[Fri Jan 26 11:25:33 CST 2024] It is recommended to install socat first.
[Fri Jan 26 11:25:33 CST 2024] We use socat for standalone server if you use standalone mode.
[Fri Jan 26 11:25:33 CST 2024] If you don't use standalone mode, just ignore this warning.
[Fri Jan 26 11:25:33 CST 2024] Installing to /root/.acme.sh
[Fri Jan 26 11:25:33 CST 2024] Installed to /root/.acme.sh/acme.sh
[Fri Jan 26 11:25:33 CST 2024] Installing alias to '/root/.bashrc'
[Fri Jan 26 11:25:33 CST 2024] OK, Close and reopen your terminal to start using acme.sh
[Fri Jan 26 11:25:33 CST 2024] Installing alias to '/root/.cshrc'
[Fri Jan 26 11:25:34 CST 2024] Installing alias to '/root/.tcshrc'
[Fri Jan 26 11:25:34 CST 2024] Installing cron job
[Fri Jan 26 11:25:34 CST 2024] Good, bash is found, so change the shebang to use bash as preferred.
[Fri Jan 26 11:25:35 CST 2024] OK
[root@nginx-20200324 acme.sh]# source ~/.bashrc

指定默认的签发商

指定默认的签发商为:Let’s Encrypt

acme.sh --set-default-ca --server letsencrypt

修改后的响应

[Fri Jan 26 11:29:12 CST 2024] Changed default CA to: https://acme-v02.api.letsencrypt.org/directory

配置阿里云DNS API

在申请SSL证书时,需要验证对该域名的所有权,可以是通过指定域名对应的网站目录的方式,也可以通过指定DNS API的方式。建议使用DNS API方式比用本地服务方式更方便;

阿里云配置

申请DNS 所有权的RAM子账号

不建议使用主账号,风险较高。

操作流程如下:
访问:https://ram.console.aliyun.com/users
在这里插入图片描述

点击创建用户,填写登录用户名和显示名称,勾选Open API的调用访问
在这里插入图片描述

完成安全验证:
在这里插入图片描述

保存好用户的Access Key ID AccessKey Secret
在这里插入图片描述

点击添加权限
在这里插入图片描述

选择指定资源,输入DNS 关键字过滤
在这里插入图片描述

选择AliyunDNSFullAccess 管理云解析(DNS)的权限
在这里插入图片描述

点击确定完成授权

在这里插入图片描述

在安装了acme.sh的服务设置阿里云API的环境变量

echo "export Ali_Key='前面保存的Access Key ID'" >> /etc/profile.d/acme_aliyun_env.sh
echo "export Ali_Secret='前面保存的AccessKey Secret'" >> /etc/profile.d/acme_aliyun_env.sh

# 使更改生效
source /etc/profile.d/acme_aliyun_env.sh

注意不要写成了 ALI_KEYALI_SECRET ,大小写是区分的。具体可以查看 /root/.acme.sh/dnsapi/dns_ali.sh 这个脚本

检测环境变量是否设置好了

echo $Ali_Key
echo $Ali_Secret

如果正确显示了你设置的API Access Key ID AccessKey Secret,则说明环境变量设置好了。

申请证书并安装到Nginx的证书目录下

申请证书

acme.sh --issue -d 需要申请证书的域名 --dns dns_ali

申请成功后的效果:

[Fri Jan 26 16:36:00 CST 2024] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Fri Jan 26 16:36:00 CST 2024] Creating domain key
[Fri Jan 26 16:36:00 CST 2024] The domain key is here: /root/.acme.sh/需要申请证书的域名/需要申请证书的域名.key
[Fri Jan 26 16:36:00 CST 2024] Single domain='需要申请证书的域名'
[Fri Jan 26 16:36:00 CST 2024] Getting domain auth token for each domain
[Fri Jan 26 16:36:05 CST 2024] Getting webroot for domain='需要申请证书的域名'
[Fri Jan 26 16:36:05 CST 2024] Adding txt value: xxxxxxxxxx for domain:  _acme-challenge.需要申请证书的域名
[Fri Jan 26 16:36:12 CST 2024] The txt record is added: Success.
[Fri Jan 26 16:36:12 CST 2024] Let's check each DNS record now. Sleep 20 seconds first.
[Fri Jan 26 16:36:33 CST 2024] You can use '--dnssleep' to disable public dns checks.
[Fri Jan 26 16:36:33 CST 2024] See: https://github.com/acmesh-official/acme.sh/wiki/dnscheck
[Fri Jan 26 16:36:33 CST 2024] Checking 需要申请证书的域名 for _acme-challenge.需要申请证书的域名
[Fri Jan 26 16:36:36 CST 2024] Domain 需要申请证书的域名 '_acme-challenge.需要申请证书的域名' success.
[Fri Jan 26 16:36:36 CST 2024] All success, let's return
[Fri Jan 26 16:36:36 CST 2024] Verifying: 需要申请证书的域名
[Fri Jan 26 16:36:38 CST 2024] Pending, The CA is processing your order, please just wait. (1/30)
[Fri Jan 26 16:36:42 CST 2024] Pending, The CA is processing your order, please just wait. (2/30)
[Fri Jan 26 16:36:47 CST 2024] Success
[Fri Jan 26 16:36:47 CST 2024] Removing DNS records.
[Fri Jan 26 16:36:47 CST 2024] Removing txt: xxxxxxxxxx  for domain: _acme-challenge.需要申请证书的域名
[Fri Jan 26 16:36:55 CST 2024] Removed: Success
[Fri Jan 26 16:36:55 CST 2024] Verify finished, start to sign.
[Fri Jan 26 16:36:55 CST 2024] Lets finalize the order.
[Fri Jan 26 16:36:55 CST 2024] Le_OrderFinalize='https://acme-v02.api.letsencrypt.org/acme/finalize/xxxxxxxxxx '
[Fri Jan 26 16:36:58 CST 2024] Downloading cert.
[Fri Jan 26 16:36:58 CST 2024] Le_LinkCert='https://acme-v02.api.letsencrypt.org/acme/cert/xxxxxxxxxx '
[Fri Jan 26 16:36:59 CST 2024] Cert success.
-----BEGIN CERTIFICATE-----
xxxxxxxxxx =
-----END CERTIFICATE-----
[Fri Jan 26 16:36:59 CST 2024] Your cert is in: /root/.acme.sh/需要申请证书的域名/需要申请证书的域名.cer
[Fri Jan 26 16:36:59 CST 2024] Your cert key is in: /root/.acme.sh/需要申请证书的域名/需要申请证书的域名.key
[Fri Jan 26 16:36:59 CST 2024] The intermediate CA cert is in: /root/.acme.sh/需要申请证书的域名/ca.cer
[Fri Jan 26 16:36:59 CST 2024] And the full chain certs is there: /root/.acme.sh/需要申请证书的域名/fullchain.cer

安装证书

acme.sh --install-cert -d 需要申请证书的域名 \
--key-file       /usr/share/nginx/cert/需要申请证书的域名.key  \
--fullchain-file /usr/share/nginx/cert/需要申请证书的域名.crt \
--ca-file        /usr/share/nginx/cert/需要申请证书的域名.ca.crt

当然这里还可以补一个nginx reload 的参数,但我个人觉得没必要,nginx统一reload会更好。

修改Nginx 的配置

#需要申请证书的域名HTTPS 配置
server{
	#监听的443端口并开启SSL
	listen 443 ssl;
	#域名可以有多个,用空格隔开
	server_name 需要申请证书的域名;
	#acme.sh 安装的证书路径
	ssl_certificate /usr/share/nginx/cert/需要申请证书的域名.crt;
	ssl_certificate_key /usr/share/nginx/cert/需要申请证书的域名.key;
	ssl_trusted_certificate /usr/share/nginx/cert/需要申请证书的域名.crt;
	#缓存有效期
	ssl_session_timeout 30m;
	#可选的加密算法,顺序很重要,越靠前的优先级越高.
	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 = / {
	   #直接访问根目录,不支持
	   return 404;
	}
  
	
	#代理app
	location ^~ /app/ {
		# 反向代理到 https://实际主机的域名:445 端口
		proxy_pass https://实际主机的域名:445;
		#传入ip
		proxy_set_header Host $http_host;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
		proxy_set_header X-Forwarded-Port $server_port;
		# 支持cros
		if ($request_method = 'OPTIONS') {
			add_header Access-Control-Allow-Origin $http_origin;
			add_header Access-Control-Allow-Credentials true;
			add_header Access-Control-Allow-Headers *;
			add_header Access-Control-Allow-Methods *;
			add_header Access-Control-Max-Age 1728000;
			return 204;
		}
	}
	 
}

修改完配置后,验证配置有效后,重新加载配置或者重启Nginx

# 校验配置
nginx -t
# 重启
systemctl restart nginx

自动续签

acme.sh 安装好后,默认会启动一个每日定时任务去自动续签证书,并且会自动执行申请证书后的安装证书的命令。

# 显示自动续签的定时任务
crontab -l

#定时任务配置如下:
34 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

备注

#手动执行自动续签的定时任务
acme.sh --cron -f

#开启自动升级(国内就别开了,是从github 升级的,拉不下来)
acme.sh --upgrade --auto-upgrade
#关闭自动升级
acme.sh --upgrade --auto-upgrade 0

如果需要pfx 的证书,可以使用以下命令转换,目前只能生成到默认目录,没找到参数修改这个输出目录。

#转换为pfx证书 并保存到/root/.acme.sh/申请证书的域名/申请证书的域名.pfx
acme.sh --toPkcs -d 申请证书的域名 --password 自定义的密码
# 显示当前申请的证书信息
acme.sh --list 

一些异常

短时间内准对同一个域名频繁申请证书会触发下面这个异常:

Create new order error. Le_OrderFinalize not found. {
"type": "urn:ietf:params:acme:error:rateLimited",
"detail": "Error creating new order :: too many certificates (5) already issued for this exact set of domains in the last 168 hours: 申请证书的域名, retry after 2024-01-27T14:54:19Z: see https://letsencrypt.org/docs/duplicate-certificate-limit/",
"status": 429
}

使用本地模式,但有没有配置域名80端口对应本地Nginx目录时的异常:

[root@nginx-20200324 letsencrypt]# acme.sh --issue -d 申请证书的域名 -w /var/www/letsencrypt
[Fri Jan 26 13:32:21 CST 2024] Using CA: https://acme-v02.api.letsencrypt.org/directory
[Fri Jan 26 13:32:21 CST 2024] Creating domain key
[Fri Jan 26 13:32:21 CST 2024] The domain key is here: /root/.acme.sh/申请证书的域名/申请证书的域名.key
[Fri Jan 26 13:32:21 CST 2024] Single domain='申请证书的域名'
[Fri Jan 26 13:32:21 CST 2024] Getting domain auth token for each domain
[Fri Jan 26 13:32:26 CST 2024] Getting webroot for domain='申请证书的域名'
[Fri Jan 26 13:32:26 CST 2024] Verifying: 申请证书的域名
[Fri Jan 26 13:32:28 CST 2024] Pending, The CA is processing your order, please just wait. (1/30)
[Fri Jan 26 13:32:32 CST 2024] 申请证书的域名:Verify error:112.124.202.116: Invalid response from http://申请证书的域名/.well-known/acme-challenge/z__-xxxxxxxxx: 404
[Fri Jan 26 13:32:32 CST 2024] Please add '--debug' or '--log' to check more details.
[Fri Jan 26 13:32:32 CST 2024] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/350019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统】实验九 写一个设备驱动程序

🕺作者: 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

分享一个“产业级,开箱即用”的NLP自然语言处理工具

NLP的全称是Natuarl Language Processing,中文意思是自然语言处理,是人工智能领域的一个重要方向 自然语言处理(NLP)的一个最伟大的方面是跨越多个领域的计算研究,从人工智能到计算语言学的多个计算研究领域都在研究计…

Python基础(二十九、pymsql)

文章目录 一、安装pymysql库二、代码实践1.连接MySQL数据库2.创建表格3.插入数据4.查询数据5.更新数据6.删除数据 三、完整代码示例四、结论 使用Python的pymysql库可以实现数据存储,这是一种连接MySQL数据库的方式。在本篇文章中,将详细介绍如何使用pym…

SpringBoot 自定义Filter 提前返回 CORS 错误 处理前后端分离跨域配置无效问题解析

前言 浏览器有跨域限制,非同源策略 (协议、主机名或端口不同) 被视为跨域请求,解决跨域有跨域资源共享(CORS)、反向代理和 JSONP的方式。本篇通过 SpringBoot 的资源共享配置 (CORS) 来解决前后端分离项目的跨域,以及从原理上去解决跨域配置…

2023年NOC大赛(学而思赛道)创意编程Python初中组决赛真题

2023年NOC大赛(学而思赛道)创意编程Python初中组决赛真题 题目总数:7 总分数:100 编程题 第 1 题 问答题 二进制回文 编程实现: 输入一个正整数,判断它的二进制形式是否是回文数,如果是输出True…

web系统服务器监控检查

一、检查操作系统是否存在增减文件,是否有shell被上传 要检查操作系统是否存在增减文件或是否有shell被上传,您可以按照以下步骤进行操作: 文件完整性检查: 使用文件系统的完整性检查工具,例如fsck(对于ext…

Backtrader 文档学习-Order Management and Execution

Backtrader 文档学习-Order Management and Execution 本章提供了关于order的详细功能测试用例,很好很重要。 最后的示例部分,详细分析总结了不同参数的效果和输出。 如果不能模拟订单交易回测就不会完整。为此,平台中提供了以下功能&…

LLM之Agent(九)| 通过API集成赋能Autogen Multi-Agent系统

随着大型语言模型的快速发展,构建基于LLM驱动的自治代理(autonomous agents)已经成为一个备受关注的话题。仅在过去一年中,就出现了许多基于这一理念的新技术和框架。 ​ 本文将探索微软开源的Agent框架:Autogen…

幻兽帕鲁服务器搭建教程分享,小白有福了

如何自建幻兽帕鲁服务器?基于阿里云服务器搭建幻兽帕鲁palworld服务器教程来了,一看就懂系列。本文是利用OOS中幻兽帕鲁扩展程序来一键部署幻兽帕鲁服务器,阿里云百科aliyunbaike.com分享官方基于阿里云服务器快速创建幻兽帕鲁服务器教程&…

vue 样式隔离原理

日常写单文件组件时&#xff0c;会在style添加scoped属性&#xff0c;如<style scoped>&#xff0c;目的是为了隔离组件与组件之间的样式&#xff0c;如下面的例子&#xff1a; <template><p class"foo">这是foo</p><p class"bar&q…

【SpringCloud Nacos】 微服务治理介绍及Nacos引入初体验

文章目录 前言服务治理介绍什么是服务治理1、服务发现2、服务配置3、服务健康检测 常见的注册中心ZookeeperEurekaConsulNacos Nacos 简介Nacos 实战入门搭建nacos环境1、安装nacos2、配置nacos3、访问nacos 将商品微服务注册到 nacos1、在 pom. xml 中添加 nacos 的依赖2、在主…

华为机考入门python3--(0)测试题1-句子平均重量

分类&#xff1a;字符串 知识点&#xff1a; 获取输入 input().strip().split(" ") 拼接列表 " ".join(list) 输出指定位数的浮点数 print("%.2f" % value) len() 函数对于很多内置的数据类型都适用&#xff0c;它返回对象的元素个数或长度。…

Android App开发基础(3)——App的设计规范

3 App的设计规范 本节介绍了App工程的源码设计规范&#xff0c;首先App将看得见的界面设计与看不见的代码逻辑区分开&#xff0c;然后利用XML标记描绘应用界面&#xff0c;同时使用Java代码书写程序逻辑&#xff0c;从而形成App前后端分离的设计规约&#xff0c;有利于提高App集…

零基础学编程工具简介,中文编程开发工具

零基础学编程工具简介&#xff0c;中文编程开发工具 一、前言 零基础自学编程&#xff0c;中文编程工具下载&#xff0c;中文编程工具构件之扩展系统菜单构件教程 编程系统化教程链接https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 给大家…

大创项目推荐 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…

并行化K-means聚类算法的实现与分析

并行化K-means聚类算法 并行化K-means聚类算法的实现与分析项目背景与意义算法原理与串行实现分析并行化策略与关键细节实验结果与讨论未来改进方向结语 并行化K-means聚类算法的实现与分析 在大数据时代&#xff0c;对数据进行高效的聚类是数据分析与挖掘的重要工具之一。本文…

云轴科技ZStack成为交通运输业上云用云推进中心首批成员单位

近日&#xff0c;中国信息通信研究院、中国交通运输协会信息专业委员会联合发起成立“交通运输业上云用云推进中心”&#xff0c;上海云轴信息科技有限公司&#xff08;简称云轴科技ZStack&#xff09;凭借优秀的产品技术创新能力和在交通运输领域的实践经验成为首批成员单位并…

37、Flink 的CDC 格式:debezium部署以及mysql示例(完整版)

Flink 系列文章 一、Flink 专栏 Flink 专栏系统介绍某一知识点&#xff0c;并辅以具体的示例进行说明。 1、Flink 部署系列 本部分介绍Flink的部署、配置相关基础内容。 2、Flink基础系列 本部分介绍Flink 的基础部分&#xff0c;比如术语、架构、编程模型、编程指南、基本的…

记录yolov8_obb训练自己的数据集

一.数据集制作 1.标注软件&#xff1a;roLabelImg roLabelImg是基于labelImg改进的&#xff0c;是用来标注为VOC格式的数据&#xff0c;但是在labelImg的基础上增加了能够使标注的框进行旋转的功能。 2.数据格式转换 2.1 xml转txt # 文件名称 &#xff1a;roxml_to_dota.p…

Linux | makefile简单教程 | Makefile的工作原理

前言 在学习完了Linux的基本操作之后&#xff0c;我们知道在linux中编写代码&#xff0c;编译代码都是要手动gcc命令&#xff0c;来执行这串代码的。 但是我们难道在以后运行代码的时候&#xff0c;难道都要自己敲gcc命令嘛&#xff1f;这是不是有点太烦了&#xff1f; 在vs中…