(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你可以酌情处理,一般仅仅是生产模式使用就行。
代码语言:javascript复制 // 配置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;
});
}
然后配置中间件
代码语言:javascript复制 if (!env.IsDevelopment())
{
app.UseHsts();
}
app.UseHttpsRedirection();
其他的就不需要处理了,本地测试一看,没有什么问题
如果说你仅仅使用Linux Nginx的话,应该就是到了这里了,毕竟已经启动了HTTPS安全模式了,配置好代理就可以起飞了,但是本文要说的就是Docker。
3、在Docker中测试
可是我们都知道,如果你使用Docker的话,容器内部是没有localhost的,因为是用的IPv6,那这种配置就是不行。而且如果不配置的话,容器内默认启动的是http协议的80端口,这个和我们的需求不一样,我们需要的是直接启动https的:
那怎么办呢,如果你看过我之前的讲解,可能就想到了,我们可以在Program里直接配置域名,可以达到目的:
代码语言:javascript复制Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseStartup<Startup>()
.UseUrls("https://*:443") // 手动指定https
;
});
这样看起来,按理说这回应该就没有问题了吧,提交到Docker来看看
竟然还报错了你看