C#更新Nginx SSL证书

news/2025/3/28 2:33:04/

现在免费的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.ppmy.cn/news/1583188.html

相关文章

23种设计模式-备忘录(Memento)设计模式

备忘录设计模式 🚩什么是备忘录设计模式?🚩备忘录设计模式的特点🚩备忘录设计模式的结构🚩备忘录设计模式的优缺点🚩备忘录设计模式的Java实现🚩代码总结🚩总结 🚩什么是…

JAVA EE_多线程-初阶(一)

1.认识线程 1.1概念 1)线程是什么 线程是在进程内部中进行运行的,可以把它想成一个“执行流“,每个线程负责执行线程内的部分代码,多个线程之间可以”同时“执行多个代码。 “同时”:指并行,采用分时复用…

ngx_http_index_t

定义在 src\http\modules\ngx_http_index_module.c typedef struct {ngx_str_t name;ngx_array_t *lengths;ngx_array_t *values; } ngx_http_index_t; 该结构体用于 存储和解析 index 指令中单个索引文件的信息 ,支持静态…

学习 - C++ 全栈聊天项目(1)架构概述和登录界面

开坑C 全栈聊天项目,项目地址C 全栈聊天项目(1)架构概述和登录界面 文章目录 C 全栈聊天项目(1)架构概述和登录界面 C 全栈聊天项目(1)架构概述和登录界面

vue3,element-plus 表格搜索过滤数据

1、表格数据 // 表格数据 import type { User } from "/interface"; const tableData ref<User[]>([]); 2、 表格搜索过滤数据 // 搜索内容 const search ref(""); // 表格过滤数据 const tableFilterData computed(() >tableData.value.fi…

一文解读DeepSeek的安全风险、挑战与应对策略

引言 DeepSeek作为中国领先的AI大模型提供商&#xff0c;凭借其开源、低成本和高性能的优势&#xff0c;迅速在全球AI市场占据重要地位。然而&#xff0c;随着其应用范围的扩大&#xff0c;DeepSeek在数据安全、模型漏洞、网络攻击等方面面临严峻挑战。本文基于最新公开资料&am…

VMWare Ubuntu 详细安装教程

VMWare Ubuntu 详细安装教程 一、下载安装VMware二、下载 Ubuntu 镜像文件三、安装 Ubuntu四、开启虚拟机 一、下载安装VMware 官网下载地址https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion知乎大佬的博客原文&#xff0c;含下载地址https://zhua…

java基础之windows电脑基础命令

windows电脑基础命令 windows电脑基础命令快捷键和功能键键盘功能键B:键盘快捷键 DOS命令行的进入方式xp下如何打开DOS控制台&#xff1f;win7下如何打开DOS控制台&#xff1f;win8下如何打开DOS控制台 DOS命令讲解 黑窗口编译文件使用黑窗口运行java程序 windows电脑基础命令 …