除了广阔的互联网,这个世界上还存在很多运行在公司内网的Web Application。假设有团队A提供的网站A,现团队B需要将网站B与之集成。网站A已使用了自签的SSL证书。团队B希望能够导出该SSL证书并转换成PEM格式,供Nginx配置给网站B使用。
接着假设上述假设成立,世界上就是有这些奇奇怪怪的需求,那么我们要怎么做呢?
在Windows上,切合我们的.NET学习主题,当然是使用C#查找当前计算机上,需要被我们导出的证书Certificate。我们以用于IIS Express的ASP.NET Core HTTPS development certificate举例,根据证书的颁发者Issuer或FriendlyName来查找该证书。

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine, OpenFlags.ReadOnly);
X509Certificate2? wantedCertificate = null;
foreach (var certificate in store.Certificates)
{
if (certificate.Issuer == "CN=localhost")
{
wantedCertificate = certificate;
}
}

在获取该证书的X509Certificate2对象后,我们要做的是生成供Nginx配置使用的PEM格式的证书crt文件和私钥key文件。

其实如果Nginx能够直接支持Windows的PFX格式证书,我们可以在IIS直接手工导出PFX证书,或者通过PowerShell脚本实现上述C#代码相同的匹配查找和导出PFX证书的操作。
但现实就是这么悲剧,我们需要摒弃唾手可得的PFX证书,转而去想办法折腾PEM格式的证书文件。
网上搜索给出的解答,都是通过OpenSSL工具转换得到crt文件和key文件。问题实际的需求是希望在安装过程自动地找到并使用网站A的证书,而不是由工程实施人员手工操作,同时也并不希望在目标Windows机器上安装OpenSSL。
考虑到PEM格式文件就是Base64编码的文本文件。以"-----BEGIN CERTIFICATE-----" 字符串开头,和以 "-----END CERTIFICATE-----"结尾。所以我们可以通过C#的X509Certificate2对象来自己生成crt和key文件,无需依赖OpenSSL。

var rawData = wantedCertificate.RawData;
using (var write = new StreamWriter(@"C:\temp\Sample.crt"))
{
write.WriteLine("-----BEGIN CERTIFICATE-----");
write.WriteLine(Convert.ToBase64String(rawData, Base64FormattingOptions.InsertLineBreaks));
write.WriteLine("-----END CERTIFICATE-----");
} var privateKey = wantedCertificate.GetRSAPrivateKey();
if (privateKey != null)
{
var keyData = privateKey.ExportRSAPrivateKey();
using (var write = new StreamWriter(@"C:\temp\Sample.key"))
{
write.WriteLine("-----BEGIN RSA PRIVATE KEY-----");
write.WriteLine(Convert.ToBase64String(keyData, Base64FormattingOptions.InsertLineBreaks));
write.WriteLine("-----END RSA PRIVATE KEY-----");
}
}

生成的文件用VSCode打开,大体长成这个样子:

生成的文件长这样:

至于怎么在Nginx中配置SSL证书,或者是ASP.NET Core怎么配置SSL证书,那就是另外一个故事了。

代码示例放在GitHub:

GitHub - manupstairs/GenerateCertUsingCSharp: The example shows how to use CSharp to generate certificates and keys in PEM format.

以下链接,是MS Learn上Windows开发的入门课程,单个课程三十分钟到60分钟不等,想要补充基础知识的同学点这里:

开始使用 Visual Studio 开发 Windows 10 应用

开发 Windows 10 应用程序

编写首个 Windows 10 应用

创建 Windows 10 应用的用户界面 (UI)

增强 Windows 10 应用的用户界面

在 Windows 10 应用中实现数据绑定

.NET 6学习笔记(6)——SSL证书的导出和格式转换的更多相关文章

  1. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  2. 【Spring学习笔记-MVC-9】SpringMVC数据格式化之日期转换@DateTimeFormat

    作者:ssslinppp       1. 摘要 本文主要讲解Spring mvc数据格式化的具体步骤: 并讲解前台日期格式如何转换为java对象: 在之前的文章<[Spring学习笔记-MVC ...

  3. MongoDB学习笔记(三)--权限 && 导出导入备份恢复 && fsync和锁

    权限                                                                                             绑定内网I ...

  4. Python Web学习笔记之SSL,TLS,HTTPS

    一. SSL 1. SSL简介 SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持.SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可 ...

  5. iOS学习笔记21-推送证书与秘钥申请

    ---恢复内容开始--- 一.iOS证书 iOS常用的证书包括开发证书和发布证书,无论是真机调试还是最终发布应用到App Store这两个证书都是必须的,它是iOS开发的基本证书.Xcode7以后真机 ...

  6. C#学习笔记(九)——集合、比较和转换

    一.集合 ** System.Collections名称空间中的几个接口提供了基本的集合功能 Ps:这里看成一个动态的链表,但是已经完美的封装好了. (一)使用集合 1.代码示例 (1)Animal. ...

  7. DLL学习笔记一(DLL导入导出)

    创建DLL: 先声明导出函数:使用__declspec(dllexport) #include"DLLSample.h" #ifndef _DLL_SAMPLE_H #define ...

  8. Spring Boot学习笔记----POI(Excel导入导出)

    业务:动态生成模板导出Excel,用户修改完再导入Excel. Spring boot + bootstrap + poi 1.添加Dependence <dependency> < ...

  9. UNP学习笔记(第十一章 名字与地址转换)

    域名系统 域名系统(Domain Name System,DNS)主要用于主机名字与IP地址之间的映射. 主机名既可以是一个简单得名字,如solaris,也可以是一个全限定域名,如solaris.un ...

  10. Scala 学习笔记之隐式参数和隐式转换并用

    隐式转换条件: 1. 当表达式类型与预期的类型不同时 2.当对象访问一个不存在的成员时 3.当对象调用某个方法,而该方法的参数声明与传入参数不相匹时. 隐式转换搜索范围: 1. 位于源火目标类型伴生对 ...

随机推荐

  1. [VUE]报错: No Babel config file detected for

    在使用vue脚手架创建的项目中,项目中每个文件的第一行都会有红色波浪线. 解决方法:在项目文件中找到package.json文件,在parserOptions里添加"requireConfi ...

  2. 使用GitHub Actions实现自动化部署

    前言 大家在工作中想必都是通过自动化部署来进行前端项目的部署的,也就是我们在开发完某个需求时,我们只需要将代码推送到某个分支,然后就能自动完成部署,我们一般不用关心项目是如何build以及如何depl ...

  3. Python中Print方法

    1 number1 = int(input("请输入第一个数:")) 2 number2 = int(input("请输入第二个数:")) 3 4 # 方法一: ...

  4. 【Docker】容器使用规范--安全挂载建议

    容器挂载过程和安全挂载建议 绑定挂载 本文所提到的挂载主要指绑定挂载(bind mount),即通过-v /xx/xx:/xx/xx 和 --mount type=bind,xxx,xxx两种方式设置 ...

  5. Go语言核心36讲49

    我们在上一篇文章中简单地讨论了网络编程和socket,并由此提及了Go语言标准库中的syscall代码包和net代码包. 我还重点讲述了net.Dial函数和syscall.Socket函数的参数含义 ...

  6. 带你从入门到精通学习WireShark

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 带你从入门到精通学习WireShark 一.什么是WireShark? 二.WireShar ...

  7. Kubernetes_从云原生到kubernetes

    一.前言 二.kubernetes和云原生 Cloud Native 直接翻译为云原生,云原生官网:https://www.cncf.io/ CNCF,表示 Cloud Native Computin ...

  8. 决策树(二):后剪枝,连续值处理,数据加载器:DataLoader和模型评估

    在上一篇文章中,我们实现了树的构造,在下面的内容中,我们将中心放在以下几个方面 1.剪枝 2.连续值处理 3.数据加载器:DataLoader 4.模型评估 一,后剪枝 • 为什么剪枝  –" ...

  9. java集合类 collection接口,List集合

    java集合类:collection接口,List集合 在java.util包中提供了一些集合类,集合类又被称为容器,常用的有List集合,Set集合,Map集合.下面将介绍collection接口和 ...

  10. Fastjsonfan反序列化(一)

    前置知识 Fastjson 是一个 Java 库,可以将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象. Fastjson 可以操作任何 Java 对象 ...