Logo

Logo

在Docker中配置ASP.NETCore的HTTPS模式

Pastore Antonio
Pastore Antonio 2023年09月21日
548 阅读 0 评论 约 3837 字 阅读约 8 分钟

(The Continued Rising Power of Developers)

使用HTTPS,让网站更安全

PS:经过两周的学习和部署迁移,目前已经把所有后端都迁到了基于Docker的Jenkins里了,相关文章可以参考《使用Jenkins来发布和代理.NetCore项目》,当然我也在纠结要不要也把vue的前端项目也迁过来,这样每次只需要动动手就可以实现持续集成和持续部署了,如果你想了解如何vue项目构建镜像,看我的这个《Docker 部署VUE项目

今天就用mvp项目做例子,虽然是BlazorServer的项目,但是本质上还是MVC项目,所以如果你的项目是MVP的,同理可得

不知道docker和Jenkins的相关内容,你学会了么?

1、两种方案来加锁

现在网站基本上已经普及了HTTPS化,虽然不能拦截所有,不过通过简单的配置也能起到很大的作用,所以,HTTPS模式一直也是被大众所接受,我现在在线的10个项目中,主要是官网,认证中心做了安全协议的配置,关于如何进行安全配置,这里有两个方案:

1、普通模式:直接在代理服务器中,配置证书,做HTTPS代理,常见的就是在Nginx中处理,我的官网和认证中心都是这么处理的,而且也对Http做了跳转,访问域名,无论是HTTP还是HTTPS的,统一都是运行HTTPS安全协议下的,相应的Nginx配置也很简单,之前也写过文章《mvc项目加个锁》。

配置文件查看链接:

http://apk.neters.club/.doc/guide/function-sheet.htm

2、项目中配置:上边的方案虽然可以满足一定的需求,但是有一个问题,比如我们用HTTPS安全协议的MVC项目做客户端,去调用认证中心的时候(这里的ids4项目也是https安全协议的),MVC客户端是不能用第一种方案的,因为第一种方案本质上还是通过nginx路由强制跳转的。所以如果用第一种方案的话,我们发起认证的时候会报错,比如客户端无效或者参数不对。那这个时候我们就需要把我们的MVC客户端,直接配置HTTPS模式的,也就是在项目内部配置的,这个也是今天要说的重点。

那接下来咱们就说下,如何把项目用HTTPS模式启动。

2、项目中配置HTTPS模式

这个是很简单的,只需要简单配置下启动服务就行。

首先就是注册相应的服务,基本自己不需要怎么修改,对于下边的AddHttpsRedirection你可以酌情处理,一般仅仅是生产模式使用就行。

 // 配置Hsts
 services.AddHsts(options =>
 {
     options.Preload = true;
     options.IncludeSubDomains = true;
     options.MaxAge = TimeSpan.FromDays(60);
     options.ExcludedHosts.Add("mvp.neters.club");
 });


 // 非开发环境
 if (!_env.IsDevelopment())
 {
     services.AddHttpsRedirection(options =>
       {
           options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
           options.HttpsPort = 443;
       }); 
 }

然后配置中间件

 if (!env.IsDevelopment())
 {
     app.UseHsts();
 }
 app.UseHttpsRedirection();




其他的就不需要处理了,本地测试一看,没有什么问题

如果说你仅仅使用Linux+Nginx的话,应该就是到了这里了,毕竟已经启动了HTTPS安全模式了,配置好代理就可以起飞了,但是本文要说的就是Docker。

3、在Docker中测试

可是我们都知道,如果你使用Docker的话,容器内部是没有localhost的,因为是用的IPv6,那这种配置就是不行。而且如果不配置的话,容器内默认启动的是http协议的80端口,这个和我们的需求不一样,我们需要的是直接启动https的:

那怎么办呢,如果你看过我之前的讲解,可能就想到了,我们可以在Program里直接配置域名,可以达到目的:

Host.CreateDefaultBuilder(args)
    .ConfigureWebHostDefaults(webBuilder =>
    {
        webBuilder
        .UseStartup<Startup>()
        .UseUrls("https://*:443") // 手动指定https
        ;
    });

这样看起来,按理说这回应该就没有问题了吧,提交到Docker来看看

竟然还报错了你看????

System.InvalidOperationException: Unable to configure HTTPS endpoint. No server certificate was specified, and the default developer certificate could not be found or is out of date.
To generate a developer certificate run ‘dotnet dev-certs https’. To trust the certificate (Windows and macOS only) run ‘dotnet dev-certs https –trust’.

其实定心一看,应该也能明白发生了什么,就是在Docker中这么启动HTTPS的话,是不允许的,因为没有服务证书,本地vs开发肯定不会有这个问题,这就是环境的差异性。

这个就是今天的重点问题出现了,在Docker中如何合理配置安全证书HTTPS。也咨询了下别人,有的建议直接用k8s,有的说直接用Linux,不用Docker,我想着应该不会这么尴尬的,那到底该如何配置呢,其实是很简单的。

4、配置https证书

那既然需要证书,我们就生成一个证书,方案有很多,你可以去某云上申请免费的证书,也可以使用openssl工具来生成自己的,生成的过程略,自行百度很简单。

但是这样的话,放到公网也是不行,毕竟自己创建的没啥用,除非你用自建的放项目里,用nginx再代理正式的。

所以还是要正规的,这里我用某讯云的上的pfx来处理。

现在有了正式,就需要配置端口监听了,直接配置kestrel:

 public static IHostBuilder CreateHostBuilder(string[] args) =>
     Host.CreateDefaultBuilder(args)
         .ConfigureWebHostDefaults(webBuilder =>
         {
             webBuilder
             .UseStartup<Startup>()
             .ConfigureKestrel(options =>
             {
                 options.Listen(IPAddress.IPv6Any, 443, listenOptions =>
                 {
                     listenOptions.UseHttps(Path.Combine(AppContext.BaseDirectory, "socialnetwork.pfx"), "123456");
                 });
             })
             //.UseUrls("https://*:443")
             ;
         });

注意这里的监听方式用的是IPv6Any,端口443,然后下边配置路径和密码,这个证书反正是假的,你自己的可要保护好。

如果想要看更多详细的内容,可以看官方的issue:

https://github.com/dotnet/AspNetCore.Docs/issues/6199

那现在提交上去,再来看看

没有问题了,撒花,基于IPv6的端口是443的容器,当然你也可以自定义修改端口。

剩下的就是映射到宿主机端口。

docker run --name=mvpcontainer -d \
-v /etc/localtime:/etc/localtime -it \
-p 5050:443 laozhangisphi/mvpimg

然后正常的nginx代理5050,刷新页面,一切正常。

https://mvp.neters.club


总结:

1、配置Startup.cs;
2、生成证书;
3、配置kestrel监听端口;

查看完整代码

橙子主题打折出售

其实我不卖,主要是这里是放广告的,所以就放了一个
毕竟主题都没做完,卖了也是坑.

购买它

附件下载

共 11 个文件
5ef40abd1bc59f2ca590931a75e1f67a
PNG 257.6 KB
0ee9d7fff58b1ba59f70fc507a808e7a
PNG 64.8 KB
cb376ddfed496eb02b53f055456df446
PNG 7.8 KB
e30b75cea5665f3c75aed82a93fe3aa2
PNG 3.8 KB
4afa8e0dafa7af3109e98669ebc04d8c
PNG 63.4 KB
4b9a9d8da3f2577dacceae689e23bc0f
PNG 28.8 KB
c62d5093a8f077721d0af318d7914120
PNG 29.6 KB
f87e828b31eee7bef5e21644bff6597f
PNG 223.6 KB
91c49a752fee4c3da5218ea032bb5990
PNG 43.8 KB
a9020dcf578db98b1353065724b7b975
PNG 33.9 KB
8f68e81a533f0ef438ccf7660a36e827
PNG 27.4 KB
部分文章可能存在转载,如果涉及到侵权,请联系删除文章。

探索AIGC相关的精彩内容,共 15 篇文章

Azure AI 服务之语音识别

简介 Azure AI 服务中的语音识别 API 是微软提供的一项先进技术,旨在帮助开发者轻松实现语 ... 在Docker中配置ASP.NETCore的HTTPS模式

2026-02-17 · Xzavier Aaron
MCP | 一文详解什么是 MCP以及 MCP 可以做什么

一、什么是 MCP MCP(Model Context Protocol)是一个专为大型语言模型(L ... 在Docker中配置ASP.NETCore的HTTPS模式

2026-02-14 · Shen, Luke
你的工作流程,值得一个“全自动数字分身”:录制、截图、成文,一气呵成

一、一句话认识 TestFlow Recorder 在数字化工作环境中,如何准确记录操作步骤并生成清 ... 在Docker中配置ASP.NETCore的HTTPS模式

2026-02-14 · Xzavier Aaron
Flowise 前端框架配置指南

用户需求 问题:有没有适合配置 Flowise 的前端框架? 目标:寻找类似 Open WebUI ... 在Docker中配置ASP.NETCore的HTTPS模式

2026-02-14 · Xzavier Aaron