合格的web后端程序员,除搬砖技能,还必须会给各种web服务器启用Https,本文结合ASP.NET Core部署模型聊一聊启用Https的方式。
温故知新
目前常见的Http请求明文传输,请求可能被篡改,访问的站点可能被伪造。
HTTPS是HTTP加上TLS/SSL协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。
流程解读
① 传输密钥是对称密钥,用于双方对传输数据的加解密
② 怎么在传输之前确立传输密钥呢?
答:针对普遍的多客户端访问受信web服务器的场景, 提出非对称密钥(公钥下发给客户端,私钥存于web服务器),双方能互相加解密,说明中间数据(传输密钥)没被篡改。
③ 再抛出疑问,客户端如何认定下发的公钥是目标web服务器的公钥?又如何确定公钥下发过程没被截取篡改?
答:追溯到握手阶段的证书验证过程,浏览器从证书提取(证书颁发机构,证书绑定的域名,证书签名,证书有效期);浏览器先验证证书绑定的域名是否与目标域名匹配;浏览器内置证书颁发机构认定该证书是其有效下发;通过签名认定该证书没被篡改
④ 所以浏览器内置的证书机构(根证书)的权威性很重要, 中毒或山寨浏览器可能携带非法的根证书。
如果面向面试记忆Https原理,恐怕有些难度,所以个人用一种 【鸡生蛋还是蛋生鸡】的方式向上追溯流程, 方便大家知其然更知其所以然。
下面演示对ASP.NET Core程序两种常见部署模型强制应用Https。
常规反向代理模型
由nginx反向代理请求到后端https://receiver.server, 在nginx上添加HTTPS证书, 并强制使用HTTPS。
worker_processes 4;
events { worker_connections 1024; }
http {
sendfile on;
upstream receiver_server {
server receiver:80;
}
server {
listen 80;
listen [::]:80;
server_name eqid.******.com;
return 301 https://eqid.******.com$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
ssl on;
server_name eqid.******.com;
ssl_certificate /conf.crt/live/******.com.crt;
ssl_certificate_key /conf.crt/live/******.com.key;
location / {
proxy_pass http://receiver_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
dotnet.exe自宿模型
Kestrel用作边缘(面向Internet)Web服务器, 这个部署模型不常见,但依旧存在。
我们利用 Visual Studio 2019项目模板构建 ASP.NetCore项目--- 勾选HTTPS支持, 会默认添加支持Https的Middleware;
app.UseHttpsRedirection 强制Http请求跳转到Https
app.UseHsts 指示浏览器为特定主机头在特定时间范围内的所有通信应用Https。
HSTS(HTTP Strict Transport Protocol)的作用是强制浏览器使用HTTPS与服务器创建连接,避免原有的301重定向Https时可能发生中间人劫持。
服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。
Development证书
VS模板构建的web会使用dotnet cli 提供的开发证书在https://localhost:5001 地址接收请求。
关于开发证书, 可倒腾 dotnet dev-certs https --help 命令:
dotnet dev-certs https -c清除证书,启动程序会报无服务器证书异常;
dotnet dev-certs https -t信任证书,会弹窗提示确认安装名为localhost的开发根证书:
- 否:web能正常启动,Https请求将获取无效证书,浏览器地址栏警示不安全(提示浏览器不信任localhost根证书,证书无效)
- 是:web正常启动,浏览器发在地址栏显示正常的Httsp小锁♎图标
在Windows上,最安全方式是使用certificate store来注册已认证的HTTPS,但是有时候希望在程序内绑定证书+私钥, 这样便于在不同平台上部署。
文件证书
ASP.NET Core支持使用硬盘上文件证书来建立Https连接(这在linux上很常见)。
以下代码允许Kestrel传入文件证书和私钥,并建立Https连接。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseKestrel(options =>
{
options.Listen(IPAddress.Loopback, 5000);
options.Listen(IPAddress.Loopback, 5001, listenOptions =>
{
listenOptions.UseHttps("certificate.pfx", "topsecret");
});
})
.UseStartup<Startup>;
务必确保不要将私钥存储在配置文件中:在开发模式,可使用user secrets 存储此类密钥;在生产模式,可考虑Azure Key Vault或环境变量。
更多密钥分离策略请参考: 密钥分离,.Net程序猿不再背锅
总结
希望本文有助于您大致了解ASP.NET Core中Https的应用方式。
这不是什么高深的理论,而是尝试以不同的方式启用Https、并着重解释相关中间件的用法。
END
扫码
推荐阅读:oppo手机和vivo手机哪个好
-
高通晒成绩单:全球34家OEM采用骁龙X55
近日,高通公司宣布目前已有34家原始设备制造商(OEM)承诺在明年推出的商用5G宽带设备中采用其骁龙X55调制解调器。这些5G宽带设备称为5G固定无线接入阵列(...
2019-10-17 -
中俄(重庆)两江经贸合作对接会在两江新区举行
10月16日,在中俄建交70周年之际,中俄(重庆)两江经贸合作对接会在两江新区举行。此次活动得到了重庆市商务委、重庆海关的大力支持。来自俄罗斯联邦政府驻中国商务...
2019-10-17 -
智能家装市场调查:智能家居的真实状况
亿欧智库发布《2019H1中国创投数据报告》,家居行业排在了倒数第一的位置,近三个月也未曾追加哪怕一星半点。截至2019年6月30日,家居融资发生次数30起,融...
2019-10-17 -
阿里董事局主席张勇:新旅行要超越消费者期望,
【环球网科技综合报道 记者 勃潺】10月16日,在飞猪新旅行商家大会上,阿里巴巴集团董事局主席兼首席执行官张勇表示,阿里巴巴20年发展,形成了面向消费者和企业两...
2019-10-17 -
16家影视公司交上第三季度成绩单:哪吒发威,
暑期档制造爆款,也催生流量。无论是大银幕上的藕饼CP,还是小荧屏上的“现男友”,他们成为今夏影视作品热门话题担当。当秋天来临,站在这些作品背后的幕后推手,也开始...
2019-10-17 -
携高端家电亮相广交会,海尔实现出口单价业内唯
本报10月16日讯 正在举行的第126届秋季广交会上,海尔携系列高端创新产品亮相。作为今年以来出口家电单价唯一上涨的品牌,海尔不仅在此次广交会上展示了系列高端产...
2019-10-17 -
腾讯宝马加持的四维图新“熄火”?Q3净利暴跌
“风口”上的四维图新,难道只能活在梦想中?10月15日,北京四维图新科技股份有限公司(以下简称“四维图新”)发布了2019年前三季度业绩预告。预告显示,四维图新...
2019-10-17 -
财鑫闻|“春天”还是“寒冬”外资零售企业频转
大众网·海报新闻济南10月16日讯(记者 辛振东)10月11日,麦德龙宣布将其中国业务出售给物美,物美将在双方成立的合资公司中占股80%,此次交易金额估计超百亿...
2019-10-17