2020年了,再不会Https就老了

简介: 合格的web后端程序员,除搬砖技能,还必须会给各种web服务器启用Https,本文结合ASP.NET Core部署模型聊一聊启用Https的方式。

温故知新


目前常见的Http请求明文传输,请求可能被篡改,访问的站点可能被伪造。


HTTPS是HTTP加上TLS/SSL协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。


80d3598e8ea2d73e6177806f80ad62ff.png


流程解读


① 传输密钥是对称密钥,用于双方对传输数据的加解密


② 怎么在传输之前确立传输密钥呢?


答:针对普遍的多客户端访问受信web服务器的场景, 提出非对称密钥(公钥下发给客户端,私钥存于web服务器),双方能互相加解密,说明中间数据(传输密钥)没被篡改。


③ 再抛出疑问,客户端如何认定下发的公钥是目标web服务器的公钥?又如何确定公钥下发过程没被截取篡改?


答:追溯到握手阶段的证书验证过程,浏览器从证书提取(证书颁发机构,证书绑定的域名,证书签名,证书有效期);浏览器先验证证书绑定的域名是否与目标域名匹配;浏览器内置证书颁发机构认定该证书是其有效下发;通过签名认定该证书没被篡改。


④ 所以浏览器内置的证书机构(根证书)的权威性很重要, 中毒或山寨浏览器可能携带非法的根证书。


如果面向面试记忆Https原理,恐怕有些难度,所以个人用一种 【鸡生蛋还是蛋生鸡】的方式向上追溯流程, 方便大家知其然更知其所以然。


下面演示对ASP.NET Core程序两种常见部署模型强制应用Https。


常规反向代理模型


9146ed023e92a745a2d2fe60ce53f0aa.png


由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服务器, 这个部署模型不常见,但依旧存在。


    a4d56e86574f0cffa0efbc3034813d60.png


    我们利用 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或环境变量。


      总结


      希望本文有助于您大致了解ASP.NET Core中Https的应用方式。


      这不是什么高深的理论,而是尝试以不同的方式启用Https、并着重解释相关中间件的用法。

      相关文章
      |
      4月前
      |
      安全 Java 网络安全
      https:邮递员
      https:邮递员
      19 3
      |
      10月前
      |
      安全 算法 网络协议
      HTTPS在什么场景是不安全的?
      HTTPS在什么场景是不安全的?
      110 1
      |
      8月前
      |
      数据安全/隐私保护 算法 安全
      你了解https吗
      你了解https吗
      你了解https吗
      |
      9月前
      |
      Java 网络安全 数据安全/隐私保护
      一篇文章让您了解HTTPS
      一篇文章让您了解HTTPS
      47 1
      |
      12月前
      |
      安全 网络协议 网络安全
      HTTPS中的S是什么?
      使用浏览器输入网址的时候,我们通常都会输入“http://”或者“https://”这样的开头(当然,更多情况下可能大家会输入www),然后才输入对应的域名地址,那这里肯定就会有不少的网友疑惑,为什么有些地址会在前面加多一个“s”呢?那么多出的“s”是什么呢?
      194 0
      HTTPS中的S是什么?
      |
      安全 算法 网络协议
      |
      Web App开发 缓存 算法
      WHY |HTTPS 为什么是安全的 ? (下)
      WHY |HTTPS 为什么是安全的 ? (下)
      WHY |HTTPS 为什么是安全的 ? (下)
      |
      Web App开发 安全 算法
      Why | Https 为什么是安全的?(上)
      Why | Https 为什么是安全的?(上)
      Why | Https 为什么是安全的?(上)
      |
      算法 安全 网络协议
      这 HTTPS,真滴牛逼!
      今天这一篇「从理论再到实战抓包」介绍 ECDHE 算法。
      这 HTTPS,真滴牛逼!
      |
      算法 安全 网络协议
      HTTPS介绍
      HTTPS (全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL,HTTPS 的安全基础是 SSL,因此加密的详细内容就需要 SSL。 HTTPS 存在不同于 HTTP 的默认端口及一个加密/身份验证层(在 HTTP与 TCP 之间)。这个系统提供了身份验证与加密通讯方法。它被广泛用于万维网上安全敏感的通讯。
      HTTPS介绍