.NET 6学习笔记生成自签证书

Posted 楼上那个蜀黍

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET 6学习笔记生成自签证书相关的知识,希望对你有一定的参考价值。

上一篇我们通过导出IIS Express的自签证书,供ASP.NET Core程序启用HTTPS。本篇我们讨论如何生成自签证书。
自签证书的生成,有多种方式。比如OpenSSL或PowerShell都可以通过命令生成证书。对于.NET程序,也有System.Security.Cryptography.X509Certificates命名空间下,对应的C#类来实现。
首先我们通过类X500DistinguishedName来填写证书的Subject,即使用者信息。
Subject中的信息用以识别证书使用者,对自签证书来说可能不太重要,常见的字段有:

 比如该证书由中国的巨硬软件研发中心使用,Subject可能就是下面的写法。

string subject = $"C=CN, O=Hugehardsoft, OU=R&D Hub, CN=Environment.MachineName";

var rsa = RSA.Create();
var x500DistinguishedName = new X500DistinguishedName(subject);
var req = 
    new CertificateRequest(x500DistinguishedName, rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

SSL证书一般通过RSA算法来生成公钥和私钥。
在创建CertificateRequest实例之后,我们需要添加DnsName,可以认为证书只对这里添加到DnsName的地址才有效。

SubjectAlternativeNameBuilder sanBuilder = new SubjectAlternativeNameBuilder();
sanBuilder.AddDnsName("localhost");
sanBuilder.AddDnsName(Environment.MachineName);
req.CertificateExtensions.Add(sanBuilder.Build());

比如上述代码,仅添加了localhost和机器名作为DnsName,那么我们在用IP地址访问时。证书将显示为不可信,网站不安全。
在完成DnsName的添加后,我们就可以生成自签证书了。通过CreateSelfSigned方法,创建一个10年有效期的证书,并将证书保存为c:\\temp\\SelfSignedSample.pfx文件,同时设置证书的导出密码为123456。我们通过Kestrel配置证书时将会用到该密码。

var cert = req.CreateSelfSigned(DateTimeOffset.Now, DateTimeOffset.Now.AddYears(10));
File.WriteAllBytes("C:\\\\temp\\\\SelfSignedSample.pfx", cert.Export(X509ContentType.Pfx, "123456"));

 参考上一篇《.NET 6学习笔记(7)——ASP.NET Core通过配置文件启用HTTPS》,我们创建一个ASP.NET Core的Web APP。

 然后在appsettings.production.json里添加Kestrel的配置项:


  "Kestrel": 
    "Endpoints": 
      "Https": 
        "Url": "https://localhost:8888",
        "Certificate": 
          "Path": "c:\\\\temp\\\\SelfSignedSample.pfx",
          "Password": "123456"
        
      
    
  

我们在Properties文件夹下的launchSettings.json中,修改对应Kestrel托管的配置项,将"ASPNETCORE_ENVIRONMENT"修改为"Production"。

  "profiles": 
    "WebAppWithSelfSignedCert": 
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7122;http://localhost:5122",
      "environmentVariables": 
        "ASPNETCORE_ENVIRONMENT": "Production"
      
    ,

此时我们用Kestrel托管(不是IIS Express)上述ASP.NET Core应用,并通过https://localhost:8888去访问该网站。会发现提示不是专用连接。这是因为我们没有信任该自签证书。

 就和12306网站的证书一样的操作,需要安装该自签证书。实际用户可以通过浏览器导出证书。然后双击进行安装。

 需要注意的是,我们应该将证书安装到“受信任的根证书颁发机构”。

完成上述操作之后。清理浏览器缓存并关闭浏览器,重新打开后我们再通过localhost:8888去访问网站,就会看到显示为可信任的https连接了。
但是如果我们用本机的IP去访问,仍然会使不受信任的状态。这是因为之前提到的没有把IP地址加入到证书的DnsName中。

本篇我们介绍了如何通过.NET中命名空间System.Security.Cryptography.X509Certificates下的Class生成自签证书。

水平所限,欢迎指正。

 GitHub:

manupstairs/CreateSelfSignedCert: Show how to create self signed certificate using C#. (github.com)

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

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

开发 Windows 10 应用程序

编写首个 Windows 10 应用

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

增强 Windows 10 应用的用户界面

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

仅在 Windows 上:net5.0-windows(或 net6.0-windows)是不是允许我在 .Net 5(或 .Net 6)中重新编译 .Net 框架?

【中文标题】仅在 Windows 上:net5.0-windows(或 net6.0-windows)是不是允许我在 .Net 5(或 .Net 6)中重新编译 .Net 框架?【英文标题】:On Windows only: does net5.0-windows (or net6.0-windows) allow me to recompile .Net framework in .Net 5 ( or .Net 6)?仅在 Windows 上:net5.0-windows(或 net6.0-windows)是否允许我在 .Net 5(或 .Net 6)中重新编译 .Net 框架? 【发布时间】:2021-11-09 04:14:01 【问题描述】:

我有 .Net 框架应用程序,旨在仅在 Windows 上运行,现在和永远。

我正在考虑将它们升级到 .Net 5 或 .Net 6,并将它们定位到 net5.0-windows(或 net6.0-windows)。来自MS website 它说

net5.0-windows 将用于公开 Windows 特定的功能, 包括 Windows 窗体、WPF 和 WinRT API。

这是否意味着我的.Net framework 应用程序可以在.Net 6 中重新编译,只要我指定net-windows 目标并且csproject 升级和编译成功,程序就可以运行我只是想让它们现在和永远都在 Windows 上运行

我的应用程序还消耗大量 .Net 框架 2.0/3.5/4.6 dll(主要与 OpenGL 和其他图形相关),我只能假设没有通用端口到 .Net 5 或 .Net 6 ,并且源代码甚至对我来说都不再可用(它们来自封闭源代码的第三方提供商)。

【问题讨论】:

你读过official documentation吗? @klaus,该文档对 .net5-windows 及其与我的场景的关系没有任何说明。也许您可以更明确地说明它是如何回答我的问题的? 该页面列出了几个tools帮助您检查迁移是否成功 @KlausGütter,根据您提到的工具,我的应用程序很可能会失败,但这是因为这些工具针对的是一般的 .net 6 升级(到任何平台,而不仅仅是 Windows)。我的用例比较有限,我只关心 Windows,我不在乎我的应用程序是否不能在 Linux 上运行。所以我仍然认为该页面与此处无关 @Graviton 文档很清楚,尽管营销宣传混淆了事情。 .NET 5 和 6 是 .NET Core 5 和 6。您不能仅重用 .NET Framework 库或仅重新编译 .NET Framework 项目。您需要将它们迁移到 .NET Core 和新的csproj 格式 【参考方案1】:

这是否意味着我的 .Net 框架应用程序可以在 .Net 6 中重新编译,

是的

程序可以正常工作吗?

很可能会,但应该做一个完整的回归测试来验证。

我的应用还消耗大量 .Net framework 2.0/3.5/4.6 dll

如果您不能迁移到 .Net 4.8,那么能够迁移到 .Net 核心的可能性很小。

(他们大多与 OpenGL 和其他图形相关),我只能假设没有通用端口到 .Net 5 或 .Net 6

每个人都必须根据具体情况进行处理;您可能刚刚回答了您自己的问题。 说晚安格蕾丝...


为您提供更好的服务是创建一个 docker 容器,该容器将为这些应用程序的旧版本提供服务,这些应用程序具有当前工作框架的目标版本。

【讨论】:

使用 docker 容器,如何解决不同 .net 版本之间的相互调用问题? 这些应用程序是否有效?如果它们当前正在运行,具有多种 .Net 风格,则在 docker 容器上重新创建工作操作系统并提供应用程序。 docker 解决方案不是 .Net 5/6 解决方案。要清楚.... :-/ 当移植到 .Net 6 失败时,它是一种替代方法....【参考方案2】:

很遗憾,您的问题没有明确的答案,因为它完全取决于(不是双关语)您的依赖项是什么。

.NET 5 旨在成为经典 .NET Framework 和 .NET Core 的统一体,并且在许多情况下它可以正常工作

从经验来看,在许多情况下,在新框架中创建一个干净的项目,从旧项目中复制所有现有文件,然后重新添加 NuGet 和项目引用,会更容易。我已经成功地为控制台应用程序、测试项目甚至 WinForms 应用程序 15-20 项目对 .NET 4.8 项目的依赖项完成了这项工作,并且它已经开箱即用 - 尽管有一个关于 .NET 4.8 依赖项的编译器警告。

但是,我还遇到了至少一个在 4.8 和 5.0 之间丢失/更改的 API - BeginInvoke。博客文章 here 更详细地描述了它。有时 NuGet 版本也存在问题。

最接近在线最终列表的是MS Doc "Changes that affect compatibility",尤其是Breaking changes for migration from .NET Framework to .NET Core 部分。我不确定这是一个更好的“来自信誉良好的来源的答案”。

至于您的 .NET 2.0 / 3.5 / 4.6 dll,我认为没有尝试就知道。有太多的未知数,特别是因为它们是第 3 方 dll。如果我不得不猜测它至少有一个不起作用,那么您是否可以找到更新版本或者替代库将包含多少工作将无法判断

至于net5.0-windows,基本上就是个软糖。虽然 .NET 5.0 以后的所有目标都是统一和跨平台的,但他们无法及时完成所有工作。我读了一篇关于它的 blob 帖子,我现在找不到,但基本上 WinForms 尤其与一些底层 Windows 专用 API 密切相关。也许是 .NET 7.0?

【讨论】:

您链接到的 Microsoft“从 .NET Framework 迁移到 .NET Core 的重大更改”文档对于 .NET 5 和 6 来说已经完全过时了。 @SimonMourier - 很高兴通过最新链接进行更正 今天还没有。现在一切都是开源的,微软已经严重减少了它的文档投资......而且你关于net5.0-windows的说法很奇怪。 net5.0-windows 仅表示 net5 + Windows-ony 依赖项(winforms、wpf、GDI+ 等)。 我认为微软不会投资于将 Windows 表单和 Windows Presentation Foundation 引入其他平台,所以这个答案中的最后一句话非常奇怪。如前所述,net5.0-windows 是 .NET 5 加上对一些仅限 Windows 的 dll 的访问权限,仅此而已 @CamiloTerevinto 也许这是一厢情愿 - 我一直在尝试并试图找到我读到的关于它的博客文章 - 它以一种听起来像是他们想要解决它们的方式解释了挑战.他们是否想投入足够的资源来实现这一目标以及在什么时间范围内非常有待商榷

以上是关于.NET 6学习笔记生成自签证书的主要内容,如果未能解决你的问题,请参考以下文章

使用xca工具生成自签证书

密码技术--证书及go语言生成自签证书

填坑:Windows下使用OpenSSL生成自签证书(很简单,一个晚上搞明白的,让后来者少走弯路)

Window下生成OpenSSL自签证书

linux中openssl生成证书和自签证书

SSL/TLS深度解析--OpenSSL 生成自签证书