news 2026/9/5 16:11:29

NET10 https证书免费自动更新通过ACME实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NET10 https证书免费自动更新通过ACME实现

添加certes与AlibabaCloud.SDK.Alidns20150109包

如下图

检查证书是否过期

var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(filePath, password); DateTime expirationDate = cert.NotAfter; if (expirationDate.AddDays(-1).Date <= DateTime.Now.Date) { //更新证书 await SSLHelper.GetPfxByACMEAsync(item, password, accessKeyId, accessKeySecret); }

更新证书源码

public static async Task GetPfxByACMEAsync(string domain, string password,string accessKeyId,string accessKeySecret) { string domainName = domain; var acme = new AcmeContext(WellKnownServers.LetsEncryptV2); try { var account = await acme.NewAccount("随意填一个你的邮箱帐号即可,例如:test@163.com", true); var order = await acme.NewOrder(new[] { domainName }); var authz = (await order.Authorizations()).First(); var dnsChallenge = await authz.Dns(); var dnsTxt = acme.AccountKey.DnsTxt(dnsChallenge.Token); //创键dns var config = new AlibabaCloud.OpenApiClient.Models.Config { // 建议使用环境变量配置 AccessKey,提高安全性 AccessKeyId = accessKeyId, AccessKeySecret = accessKeySecret, // 云解析DNS的Endpoint Endpoint = "alidns.aliyuncs.com" }; var client = new AlibabaCloud.SDK.Alidns20150109.Client(config); var request = new AddDomainRecordRequest { DomainName = domainName, RR = "_acme-challenge", Type = "TXT", Value = dnsTxt, TTL = 600 }; var response = client.AddDomainRecord(request); var validateResult = await dnsChallenge.Validate(); if (validateResult.Status != Certes.Acme.Resource.ChallengeStatus.Valid) { var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); while (!cts.Token.IsCancellationRequested) { await Task.Delay(1000, cts.Token); // 重新获取最新状态 var currentChallenge = await dnsChallenge.Resource(); if (currentChallenge.Status == Certes.Acme.Resource.ChallengeStatus.Valid) { break; } } } var privateKey = KeyFactory.NewKey(KeyAlgorithm.ES256); var cert = await order.Generate(new CsrInfo { CommonName = domainName, }, privateKey); var certificateChain = await order.Download(); var pfxBuilder = certificateChain.ToPfx(privateKey); pfxBuilder.FullChain = false; var deleteRequest = new DeleteDomainRecordRequest { RecordId = response.Body.RecordId }; client.DeleteDomainRecord(deleteRequest); var pfx = pfxBuilder.Build($"{domainName}.pfx", password); System.IO.File.WriteAllBytes($"{domainName}.pfx", pfx); } catch (TeaException ex) { throw new Exception($"ACME获取证书错误: {ex.Message}", ex); } }

关于accessKeyId与accessKeySecret生成参考下面链接

阿里云密钥参考

ABP添加定时任务每天检查过期

public class SSLCheckerWorker : AsyncPeriodicBackgroundWorkerBase { private readonly IConfiguration _configuration; public SSLCheckerWorker(AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory, IConfiguration configuration) : base(timer, serviceScopeFactory) { _configuration = configuration; // 每天凌晨 2:00 执行一次 Timer.Cron = "0 2 * * *"; } protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) { // 执行每日任务 var domains = _configuration["Acme:Domains"]; if (!string.IsNullOrEmpty(domains)) { var password = _configuration["Acme:password"]; var accessKeyId = _configuration["Aliyun:accessKeyId"]; var accessKeySecret = _configuration["Aliyun:secret"]; // 构建域名到证书文件的映射 var domainMap = domains.Split(';', StringSplitOptions.RemoveEmptyEntries); foreach (var item in domainMap) { string filePath = $"{item}.pfx"; var checkFile = System.IO.File.Exists(filePath); if (checkFile) { var cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(filePath, password); DateTime expirationDate = DateTime.Parse(cert.GetExpirationDateString()); if (expirationDate.AddDays(-1).Date <= DateTime.Now.Date) { //更新证书 await SSLHelper.GetPfxByACMEAsync(item, password, accessKeyId, accessKeySecret); } } } } await Task.CompletedTask; } }

在OnApplicationInitialization添加后台任务

配置文件参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 6:14:21

零基础数据分析工具设计:从环境准备到实战避坑全指南

1. 先搞清楚“人人都是数据分析师”到底要解决什么问题看到“人人都是数据分析师”这个标题&#xff0c;很多人第一反应可能是又一个数据分析工具或者课程。但结合“退休后”和“vibe coding”来看&#xff0c;这个项目的核心价值可能不在于提供一个功能多么强大的专业工具&…

作者头像 李华
网站建设 2026/9/2 6:12:54

linux操作系统-信号的产生与保存

什么是信号在我们日常生活中也有很多信号&#xff0c;比如日常生活中的红绿灯&#xff0c;还有快递到驿站了&#xff0c;也是一个信号&#xff0c;这个信号是给人发送的&#xff0c;在linux系统中&#xff0c;信号是给对应的进程发送的linux当中的信号在我们日常编写代码中&…

作者头像 李华
网站建设 2026/9/2 6:12:37

AI SaaS按Token计费实战:基于Spring Boot的计量扣费系统设计

最近在折腾 SaaS 项目的计费体系时&#xff0c;我越来越强烈地感觉到&#xff1a;传统“按月订阅”的模式&#xff0c;正在被 AI 时代一种更细颗粒度的玩法冲击——按 token 付费。这个想法源于一个很现实的场景&#xff1a;市面上的 AI 写作、AI 客服、AI 绘画工具&#xff0c…

作者头像 李华
网站建设 2026/9/5 4:24:28

DeepSeek API涨价后,本地部署MiniMax与MiMo模型替代方案实战评测

如果你正在使用 DeepSeek 的 API 服务&#xff0c;最近可能已经收到了价格调整的通知。对于依赖其进行代码生成、文本处理或日常开发的个人开发者和团队来说&#xff0c;成本突然增加是一个需要立刻应对的现实问题。与其被动接受&#xff0c;不如主动寻找替代方案。这次我们直接…

作者头像 李华
网站建设 2026/9/4 8:38:10

AI智能体的判断力:Agent从能执行到会判断的关键

最近看到几篇围绕AI智能体&#xff08;Agent&#xff09;的科研论文投稿反馈&#xff0c;题目各不相同&#xff0c;被拒理由却指向同一个词&#xff1a;判断力。论文里的Agent能规划任务、能调用工具、能跑完整流程&#xff0c;模型版本也用到了当时的主流方案&#xff0c;实验…

作者头像 李华