C#更新Nginx SSL证书

news/2025/3/28 10:13:37/文章来源:https://www.cnblogs.com/dx5800/p/18753185

现在免费的SSL证书三个月就到期了,为了方便写了一个更新SSL证书的程序,把程序和xxx_nginx.zip的证书放在同一目录下,先解压ssl文件,然后上传到服务器,最后复制到nginx的路径下。一台服务器有多个ssl证书,最好ssl有效期控制在同一天这样方便更新,只需要将多个ssl压缩包和程序放在一起即可。

代码如下:

Install-Package DotNetZip -Version 1.16.0
Install-Package SSH.NET -Version 2024.2.0
using Ionic.Zip;
using Renci.SshNet;
using System;
using System.IO;class Program
{static void Main(){Console.WriteLine("即将启动SSL证书更新,按任意键继续。");Console.ReadKey();string currentDir = Directory.GetCurrentDirectory();var result = UnzipFile(currentDir);if (!result){Console.WriteLine("文件提取失败");Console.WriteLine("按任意键退出");Console.ReadKey();return;}Console.WriteLine("文件提取完成");Console.WriteLine("按任意键继续");Console.ReadKey();SSHClient(currentDir);Console.WriteLine("按任意键退出任务");Console.ReadKey();}public static bool UnzipFile(string currentDir){var files = Directory.GetFiles(currentDir, "*nginx.zip");if (files.Length == 0){return false;}foreach (string zipFile in files){try{using (ZipFile zip = ZipFile.Read(zipFile, new ReadOptions { Encoding = System.Text.Encoding.Default })){foreach (ZipEntry entry in zip){if (entry.IsDirectory) continue;string ext = Path.GetExtension(entry.FileName).ToLower();if (ext == ".key" || ext == ".pem")//根据自己要求,也可以把所有文件都解压出啦{entry.Extract(currentDir, ExtractExistingFileAction.OverwriteSilently);}}}var path = Path.Combine(currentDir, Path.GetFileNameWithoutExtension(zipFile));foreach (string file in Directory.GetFiles(path)){string destFile = Path.Combine(currentDir, Path.GetFileName(file));File.Copy(file, destFile, true);  // true表示如果文件已存在则覆盖}Directory.Delete(path, true);}catch (Exception ex){Console.WriteLine($"解压失败:{zipFile}\n错误信息:{ex.Message}");return false;}}return true;}public static void SSHClient(string currentDir){string host = "host";  // 服务器地址string username = "username";  // 登录用户名string password = "password";  // 登录密码string remoteFilePath = "/home/username/ssl/";  // 远程服务器上的目标文件路径string sudoPassword = "sudoPassword";  // sudo 密码try{// 上传文件到服务器using (var sftp = new SftpClient(host, username, password)){sftp.Connect();Console.WriteLine("成功连接到FTP服务器");var allFiles = Directory.GetFiles(currentDir)//根据自己要求过滤文件.Where(file => file.EndsWith(".key", StringComparison.OrdinalIgnoreCase) ||file.EndsWith(".pem", StringComparison.OrdinalIgnoreCase));foreach (var item in allFiles){using (var fileStream = File.OpenRead(item)){sftp.UploadFile(fileStream, $"{remoteFilePath + Path.GetFileName(item)}");Console.WriteLine($"{Path.GetFileName(item)}文件上传成功!");}} sftp.Disconnect();Console.WriteLine("FTP服务器断开连接");Console.WriteLine("按任意键继续");Console.ReadKey();}// 执行sudo命令using (var sshClient = new SshClient(host, username, password)){sshClient.Connect();Console.WriteLine("成功连接到SSH服务器");// 通过 SSH 执行需要 sudo 的命令string sudoCommand = "echo " + sudoPassword + " | sudo -S /home/username/update_ssl.sh"; // 这里用 echo 将密码传递给 sudovar command = sshClient.RunCommand(sudoCommand);if (!string.IsNullOrEmpty(command.Error)){Console.WriteLine("命令执行消息:"+command.Error);}Console.WriteLine("命令执行结果: " + command.Result);sshClient.Disconnect();Console.WriteLine("SSH服务器断开连接");}}catch (Exception ex){Console.WriteLine("错误: " + ex.Message);}}
}

update_ssl.sh 代码如下

#!/bin/bash
# 复制证书文件(需root权限)
sudo cp /home/username/ssl/* /etc/nginx/conf.d/ssl/# 检查配置语法并重载
if sudo nginx -t; thensudo nginx -s reloadecho "SSL证书更新成功!"
elseecho "Nginx配置检查失败,请排查错误!"exit 1
fi

配置免密sudo‌

echo sudoPassword | sudo -S ./update_ssl.sh #替代安全方案‌
#在/etc/sudoers中添加NOPASSWD规则,允许特定命令无需密码:
username ALL=(ALL) NOPASSWD: /home/username/update_ssl.sh

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

apisix~csrf插件

https://www.devzery.com/post/how-to-test-api-with-csrf-token-in-postman-complete-guide https://apisix.apache.org/docs/apisix/plugins/csrf/配置信息 {key: token的密钥expires:过期时间,默认7200(秒)name: token在cookie中的名称,默认是apisix-csrf-token }插件…

DeepSeek 官方推出的实用集成工具百宝箱,建议收藏!

项目介绍 该实用集成工具百宝箱汇聚了DeepSeek官方精心挑选和推荐的各类集成工具(其中包括:应用程序、AI Agent 框架、AI数据应用框架、RAG 框架、浏览器插件、VS Code 插件等),旨在帮助用户轻松实现DeepSeek功能的扩展与应用。无论你是AI开发者、数据分析师还是普通用户,…

律所管理太费劲?用对系统,让你的律所越做越大!

做律所管理,光会打官司不够,你得是个“ 全能型选手 ”。 不仅要懂法律,还得会 经营、管理、营销、服务 。否则,客户难找、团队不好带、案子越来越乱,日子也越来越难过。 那具体需要哪些能力呢?这 六大能力 ,每一项都很重要,但要靠人工管理,效率太低,容易出错。这时候…

20244221李留斌《python程序设计》实验一报高

20244104 2024-2025-2 《Python程序设计》实验x报告 课程:《Python程序设计》 班级:2442 姓名:李留斌 学号:20244221 实验教师:王志强 实验日期:2025年3月23日 必修/选修: 公选课 一、实验内容 1.熟悉Python开发环境; 2.练习Python运行、调试技能; 3.编写程序,练习…

Pydantic异步校验器深:构建高并发验证系统

title: Pydantic异步校验器深:构建高并发验证系统 date: 2025/3/25 updated: 2025/3/25 author: cmdragon excerpt: Pydantic异步校验器基于async/await实现非阻塞验证,支持DNS查询等网络操作。高并发场景下运用批量API验证与异步数据库查询,通过asyncio.gather提升吞吐效…

《电子营业执照》的下载及使用

【电子营业执照的下载及使用】可以直接点此进行学习,也可以看下面我自己写的 一、电子营业执照的下载 (1)打开法人的手机微信,在微信中搜索“电子营业执照小程序”(2)点击“下载执照”(3)输入身份信息(4)人脸识别(5)选择登记地“甘肃”(6)下载执照二、电子营业执…

3月24日练习

第五题:最优配餐 考点:多源bfs 当权重(每条边开销为1)的最短路问题可以用bfs 做法:将每个分店先入队,然后依次对每个分店向前后左右走,只要能到达客户那里那么当前饭店就是距离客户最近的饭店,满足了这个客户以后要对这个用户标注不重复遍历。 算法思想:#include<b…

lc 315. 计算右侧小于当前元素的个数

```C typedef struct Node {int num; // 值int index; // 原数组索引int size; // 逆序对数量 } Node;class Solution { public:void mergeSort(vector<Node> &arr, int left, int right) {if (left >= right) return;int mid = (left + right) >> 1;…

windows 修改chrome默认安装目录

现在最新版的 Chrom 在安装时仍然不允许用户选择安装路径, 32 位版本会安装到 C:\Program Files (x86)\Google\Chrome 目录,64 位版本会安装到 C:\Program Files\Google\Chrome 目录,而其用户数据目录仍然被设置在当前用户目录下 C:\Users\%USERPROFILE%\AppData\Local\Goog…

Android 8.0系统的通知栏适配

为什么要进行通知栏适配? 现在经常是早上一觉醒来拿起手机一看,通知栏上全是各种APP的推送,烦。随着智能手机发展的成熟,通知栏搞得越来越不讨人喜欢了。各个App都希望抢占通知栏的空间,来尽可能地销售自己的产品。 通知栏是Android系统原创的,虽说乔布斯一直认为Android…

日事清25年战略目标如何高效执行?企业组织架构优化与项目管理全流程解析

如何使用日事清搭建一份可实现的25年战略目标-执行体系?在这个快节奏的商业世界里,每个企业都需要弄清楚几个超重要的问题: 首先,你的企业使命和抱负够不够清晰 ——能不能让每一个员工充满归属感和使命感? 然后,你们团队有没有一个明确的目标体系?还是只是在“摸着石头…

Obsidian 笔记一键转换发布为 Jekyll 博客

Obsidian 是一款功能强大且灵活的知识管理和笔记软件,与 Jekyll 这一轻量级静态博客框架的结合,既能保留 Obsidian 的网状知识关联优势,又能借助 Jekyll 的高效编译能力快速生成标准化博文。 Obsidian 笔记自动转换为 Jekyll 博客一文介绍了如何把挑选出的 Obsidian 笔记转换…