C#生成CSR(CertificateSigningRequest)和密钥
使用C#原生生成CSR(CertificateSigningRequest)和密钥。
生成的私钥妥善保存,丢失无法找回。
调用
var contents = X509Helper.SigningRequestHelper.CreateSigningRequest("yourdomain.com", ["*.yourdomain.com"], X509Helper.AsymmetricAlgorithmType.EC_P256, out string privateKey);Console.WriteLine(contents);
Console.WriteLine(privateKey);
输出
-----BEGIN CERTIFICATE REQUEST-----
MIIBEjCBuQIBADAZMRcwFQYDVQQDEw55b3VyZG9tYWluLmNvbTBZMBMGByqGSM49AgEGCCqGSM49
AwEHA0IABJj1dQnVVGlYxSCzucILf0j+oM1Up7q+5O+IqRXk6+91F4MY+jYmirA/l4pVnADm88Ts
4BOsZQDLL9l860HhZNGgPjA8BgkqhkiG9w0BCQ4xLzAtMCsGA1UdEQQkMCKCDnlvdXJkb21haW4u
Y29tghAqLnlvdXJkb21haW4uY29tMAoGCCqGSM49BAMCA0gAMEUCIQDGpHPxvVodEKQVFiroUQUF
36b3ODhthoghymjjFhl+TQIgAnjkgIkGlmEjr9WIJna2bEOfelRohl/rdiiKnZdlvpA=
-----END CERTIFICATE REQUEST----------BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgmECK+y6xcaUBIb5mGjBFlyN2XFLH
/z5zr95ppKMK1t6hRANCAASY9XUJ1VRpWMUgs7nCC39I/qDNVKe6vuTviKkV5OvvdReDGPo2Joqw
P5eKVZwA5vPE7OATrGUAyy/ZfOtB4WTR
-----END PRIVATE KEY-----
源码
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;namespace X509Helper
{public enum AsymmetricAlgorithmType{EC_P256 = 1,EC_P384 = 2,EC_P521 = 3,RSA_2048 = 11,RSA_4096 = 12,}public class SigningRequestHelper{/// <summary>/// 秘钥初始化参数/// </summary>private class AsymmetricAlgorithmParameters{private readonly AsymmetricAlgorithmType type;public AsymmetricAlgorithmParameters(AsymmetricAlgorithmType type){this.type = type;}public bool IsECC => type < AsymmetricAlgorithmType.RSA_2048;public bool IsRSA => type >= AsymmetricAlgorithmType.RSA_2048;/// <summary>/// 创建非对称加密算法/// </summary>/// <returns></returns>public AsymmetricAlgorithm CreateAsymmetricAlgorithm(){return type switch{AsymmetricAlgorithmType.EC_P256 => ECDsa.Create(ECCurve.NamedCurves.nistP256),AsymmetricAlgorithmType.EC_P384 => ECDsa.Create(ECCurve.NamedCurves.nistP384),AsymmetricAlgorithmType.EC_P521 => ECDsa.Create(ECCurve.NamedCurves.nistP521),AsymmetricAlgorithmType.RSA_2048 => RSA.Create(2048),AsymmetricAlgorithmType.RSA_4096 => RSA.Create(4096),_ => throw new NotSupportedException()};}public CertificateRequest CreateCertificateRequest(X500DistinguishedName names, AsymmetricAlgorithm algorithm){return type switch{AsymmetricAlgorithmType.EC_P256 or AsymmetricAlgorithmType.EC_P384 or AsymmetricAlgorithmType.EC_P521=> new CertificateRequest(names, algorithm as ECDsa, HashAlgorithmName.SHA256),AsymmetricAlgorithmType.RSA_2048 or AsymmetricAlgorithmType.RSA_4096=> new CertificateRequest(names, algorithm as RSA, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1),_ => throw new NotSupportedException()};}}/// <summary>/// 创建CSR/// </summary>/// <param name="commonName">公用名-commonName</param>/// <param name="san">备用名称-SubjectAltNames</param>/// <param name="alg">公钥算法,允许的值:EC-P256, EC-P384, EC-P521, RSA-2048, RSA-4096</param>/// <param name="privateKey">导出私钥</param>/// <returns></returns>public static string CreateSigningRequest(string commonName, List<string> san, AsymmetricAlgorithmType alg, out string privateKey){AsymmetricAlgorithmParameters algorithm = new(alg);X500DistinguishedName names = new($"CN={commonName}");using AsymmetricAlgorithm provider = algorithm.CreateAsymmetricAlgorithm();CertificateRequest request = algorithm.CreateCertificateRequest(names, provider);//构造SAN扩展if (san != null && san.Count > 0){if (!san.Contains(commonName)) san.Insert(0, commonName);SubjectAlternativeNameBuilder builder = new();foreach (string dnsName in san){builder.AddDnsName(dnsName);}request.CertificateExtensions.Add(builder.Build());}//导出私钥privateKey = GenetratePemContents(provider.ExportPkcs8PrivateKey(), "PRIVATE KEY");//导出CSRreturn GenetratePemContents(request.CreateSigningRequest(), "CERTIFICATE REQUEST");}private static string GenetratePemContents(byte[] data, string tag){return $"-----BEGIN {tag}-----\r\n{Convert.ToBase64String(data, Base64FormattingOptions.InsertLineBreaks)}\r\n-----END {tag}-----\r\n";}}
}
相关文章:
C#生成CSR(CertificateSigningRequest)和密钥
使用C#原生生成CSR(CertificateSigningRequest)和密钥。 生成的私钥妥善保存,丢失无法找回。 调用 var contents X509Helper.SigningRequestHelper.CreateSigningRequest("yourdomain.com", ["*.yourdomain.com"], X509Helper.AsymmetricAl…...
Docker 安装 Oracle创建表空间并导入数据库
一、Docker 安装Oracle 1、检查docker 版本 2、docker 下载镜像 3、 docker启动容器 4、 进入容器内部 5、安装成功,使用客户端工具连接 二、创建数据库用户与表空间 1、查询数据库文件位置 2、创建表空间 3、创建用户 4、设置权限 三、导出数据库DMP …...
elementui table子级tree懒加载bug
1. 删除子级刷新列表子级依然显示 2.更新状态子级列表未刷新 3.编辑子级后刷新页面显示状态未变更 el-table 树表格load源码 首先,load可以执行,但是只剩一个子节点就有问题,那么就直接可以定位bug在load方法里: 文件路径&am…...
AI与低代码技术融合:如何加速企业智能化应用开发?
引言 随着全球数字化转型的步伐加快,企业在智能化应用开发方面面临着前所未有的挑战和机遇。传统的软件开发方式往往需要大量的技术人员、时间和资源,而在瞬息万变的市场环境中,这种模式显得效率低下且难以满足企业快速迭代和创新的需求。 与…...
【C#】新建窗体文件,Form、UserControl
从用途、功能性和架构方面进行描述。 1. 继承自 Form 的窗体(通常是窗口): 在 C# 中,Form 是用于创建应用程序的主窗口或对话框窗口的类。当您继承自 Form 时,您创建的是一个完整的窗口,可以显示内容、与…...
ansible学习笔记之02command模块与shell模块
目录 1、概述 2、模块介绍 2.1 command模块 2.2 shell模块 2.3 小结 3、实验 3.1 测试ls命令 3.2 测试环境变量 3.3 测试操作符">" 1、概述 本文介绍ansible的command模块与shell模块,并通过实验比对两个模块的异同。 2、模块介绍 2.1…...
在Docker中部署禅道,亲测可用
1、确保centos中已安装docker docker -v 2、启动docker systemctl start docker 3、可设置docker开机启动 systemctl enable docker.service 4、获取最新版禅道开源版镜像 docker pull idoop/zentao 5、运行镜像生成禅道容器【创建 /data/www /data/data 目录】 doc…...
C++(十二)
前言: 本文将进一步讲解C中,条件判断语句以及它是如何运行的以及内部逻辑。 一,if-else,if-else语句。 在if语句中,只能判断两个条件的变量,若想实现判断两个以上条件的变体,就需要使用if-else,if-else语…...
【数学建模】线性规划问题及Matlab求解
问题一 题目: 求解下列线性规划问题 解答: 先将题目中求最大值转化为求最小值,则有 我们就可以得到系数列向量: 我们对问题中所给出的不等式约束进行标准化则得到了 就有不等式约束条件下的变系数矩阵和常系数矩阵分别为: 等式…...
【JavaWeb后端学习笔记】Spring全局异常处理器
在程序运行时,不可避免的会出现异常。在三层开发架构中,当Mapper层出现异常、如果不进行处理会抛给Service层,如果Service层也不处理则会抛给Controller层,通常Controller层有许多接口,如果对每个接口单独处理异常&…...
PT8M2102 触控型 8Bit MCU
1 产品概述 ● PT8M2102 是一款基于 RISC 内核的8位 MTP 单片机,内部集成了电容式触摸感应模块、TIMER,PWM、LVR、LVD、WDT等外设,其主要用作触摸按键开关,广泛适用于触控调光、电子玩具、消费电子、家用电器等领域,具…...
4. React 性能优化技巧:如何让你的应用更快
在构建大型应用时,性能优化是一个非常重要的话题。React 提供了许多优化工具,帮助我们提高应用的渲染速度和响应能力。本文将分享一些常见的 React 性能优化技巧。 4.1. 使用 React.memo 缓存组件 当组件的 props 没有变化时,React 默认不会…...
pytest中使用conftest做测试前置和参数化
pytest中比较高阶的应用是,使用conftest去做测试前置工作、测试收尾工作和参数化。conftest是pytest的一个组件,用于配置测试环境和参数。通过conftest, 可以创建一个可复用的测试配置文件,以便在多个测试模块之间共享配置信息。即࿰…...
Spring Boot 中使用 @Transactional 注解配置事务管理
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污…...
MATLAB 建筑顶面面积计算(95)
MATLAB 建筑顶面面积计算(95) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 根据给出的建筑顶面点云,计算建筑面积,具体的方法实现和结果如下: 二、算法实现 1.代码 代码如下(示例): % 从 PLY 文件读取点云数据 filename = D:\shuju\屋顶2.ply; % 替换为你的…...
Linux网络编程之---组播和广播
一.组播 1.概述 单播地址标识单个IP 接口,广播地址标识某个子网的所有IP 接口, 多播地址标识一组IP 接口。单播和广播是寻址方案的两个极端(要么单个要么全部), 多播则意在两者之间提供一种折中方案。多播数据报只应该由对它感兴趣的接口接收…...
Apache Dolphinscheduler可视化 DAG 工作流任务调度系统
Apache Dolphinscheduler 关于 一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 DolphinScheduler 的主要特性如下: 易于部署,提供四种部署方式&am…...
docker 部署共享文档ZFile
1、拉取ZFile镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/tirling-pdf/zfile:latest 2、创建文件夹和进入文件夹 mkdir zfile && cd zfile 3、创建docker-compose.yml配置文件。 vim docker-compose.yml version: 3.3 service…...
面试题之JVM
一、Java虚拟机基本概念 题目1:Java虚拟机(JVM)是什么? 选项: A. 一种编程语言 B. 一个可以执行Java字节码的虚拟机进程 C. 一个操作系统 D. 一个数据库 参考答案:B 解析:Java虚拟机是一个可…...
二叉树的深搜(不定期更新。。。。。)
二叉树的深搜 验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉…...
风冷热泵中央空调系统安装:从冷热源到末端联动的完整解析
一、什么是风冷热泵中央空调系统安装?风冷热泵中央空调系统安装,是指在办公楼、商业综合体、酒店、学校、医院、厂房办公区、实验室、园区配套建筑以及各类中小型公共建筑中,根据建筑冷热负荷、使用时段、空间功能和节能要求,对风…...
Play Integrity API Checker:5分钟快速掌握Android设备安全检测终极指南
Play Integrity API Checker:5分钟快速掌握Android设备安全检测终极指南 【免费下载链接】play-integrity-checker-app Get info about your Device Integrity through the Play Intergrity API 项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-chec…...
【Midjourney v8审美跃迁指南】:20年AI视觉专家亲授8大不可逆的艺术判断法则
更多请点击: https://intelliparadigm.com 第一章:Midjourney v8审美跃迁的本质动因 Midjourney v8 的审美跃迁并非单纯模型参数堆叠的结果,而是多维度协同演化的系统性突破。其核心动因植根于训练数据范式的重构、隐空间解耦能力的增强&am…...
OrangePi串口实战:从pyserial配置到USB-TTL数据抓取
1. 环境准备与硬件连接 第一次玩OrangePi串口通信时,我对着桌上那堆USB-TTL模块和杜邦线发呆了半小时。后来才发现,硬件连接其实比想象中简单。你需要准备三样东西:OrangePi开发板(我用的是OrangePi 5)、USB-TTL转换模…...
免费解锁B站大会员4K视频:Python下载器完整使用指南
免费解锁B站大会员4K视频:Python下载器完整使用指南 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站上的精彩视频…...
Odrive多线程架构实战:如何为你的无刷电机项目定制启动流程与状态机
Odrive多线程架构实战:如何为你的无刷电机项目定制启动流程与状态机 在无刷电机控制领域,Odrive凭借其开源特性和强大的性能表现,已成为众多硬件开发者的首选平台。但当你需要将这套系统集成到自己的机器人关节、CNC主轴或无人机推进系统中时…...
番茄小说下载器终极指南:如何轻松构建个人离线图书馆
番茄小说下载器终极指南:如何轻松构建个人离线图书馆 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否经常在地铁、高铁或飞机上想要阅读番茄小说,…...
鲲鹏超节点系统应用创新竞争力
鲲鹏超节点通过灵衢互联,打破传统的服务器边界,实现以数据为中心的全互联架构,为AI infra而生,具备大带宽、低时延、统一编址、内存语义、内存借用、内存共享、对等互联等关键能力,灵衢软件全面开源开放,让…...
别让电源拖后腿!手把手教你用Sigrity PowerDC搞定PCB直流压降仿真(附HyperLynx SPD转换指南)
电源完整性实战:从零掌握Sigrity PowerDC直流压降仿真全流程 在高速PCB设计中,电源网络的稳定性往往决定了整个系统的可靠性。想象一下这样的场景:一款精心设计的硬件产品在实验室测试时频繁出现异常重启,经过两周的排查最终定位到…...
Lyrebird语音变声器完整指南:从安装到高级使用技巧
Lyrebird语音变声器完整指南:从安装到高级使用技巧 【免费下载链接】lyrebird 🦜 Simple and powerful voice changer for Linux, written with Python & GTK 项目地址: https://gitcode.com/gh_mirrors/lyr/lyrebird Lyrebird是一款专为Linu…...
