HTTPS的工作原理

什么是 HTTPS?

HTTP 是一种用于在服务器和客户端(Web 浏览器)之间交换数据的互联网协议。 HTTPS 只不过是在HTTP的基础上添加了安全层。 HTTP 不是一个安全协议:它是为了纯粹的功能目标而设计的,没有考虑任何安全约束。

所以我们给HTTP添加了一个安全层。更准确地说,将 HTTP 封装到安全连接中。

HTTPS 使我们能够实现三个目标:

  • 身份验证:HTTPS 使用数字证书来验证服务器和客户端的身份,防止中间人攻击。服务器需要提供有效的数字证书,而客户端可以验证证书的有效性,确保与正确的服务器建立连接。
  • 隐私:网络上的任何人都无法读取数据,因为它是加密的
  • 完整性:HTTPS 使用消息摘要算法(如 SHA-256)来计算数据的摘要,并将摘要与数据一起传输。接收方可以验证数据的完整性,确保数据在传输过程中未被篡改。

证书颁发机构

证书颁发机构是提供 SSL 证书的公司。这些组织为网络浏览器所熟知,并接受这些机构提供的证书。 任何人都可以生成证书,但如果不是由已知机构提供的,浏览器会显示安全警报。

证书颁发机构示例:DigiCert、GeoTrust、GlobalSign、CFCA、TrustAsia

SSL 握手

SSL 握手是 Web 服务器和浏览器讨论并商定要使用的协议(特定版本中的 SSL 或 TLS)、要使用的密码套件以及最后要使用的会话密钥的过程。握手完成后进行通信。

图片来源:code-maze.com/wp-content/...

不深究细节,握手会经过以下步骤:

  1. 浏览器和服务器就所使用的协议达成一致(SSL X、TLS X)
  2. 浏览器验证服务器的真实性(证书颁发机构)
  3. 浏览器创建会话密钥并使用服务器的公钥对其进行加密
  4. 服务器用其私钥解密先前的消息
  5. 浏览器和服务器使用他们刚刚商定的会话密钥进行通信。握手完毕。

感兴趣的同学也可以抓包看一下https访问的详细过程,下面是用wireshark抓包的结果

握手完成后数据传输的都是加密的数据

密码套件

HTTPS 内存在不同级别的加密。 如前所述,HTTPS 是将 HTTP 封装到安全协议 SSL 或 TLS 中。 这两种安全协议存在不同的版本,其中一些被认为是较弱的。自"POODLE"漏洞以来,SSL V2 已过时,SSL V3 也已过时。(感兴趣的同学可以自行百度) 使用:TLS v1.0、v1.1、v1.2

此外,SSL和TLS使用不同的加密算法。这些算法在通信过程中使用,使用哪种算法取决于服务器和浏览器接受的算法。 随着时间的推移,其中一些算法会变得很弱,必须停用: 例如,我们可以提到密钥大小低于 128 位的所有密码和 RC4 算法。

因此,有必要使系统保持最新,特别是 Web 服务器的 HTTPS 配置。

client hello

下面是我们通过wireshar抓包查看客户端支持的密码套件

server hello

客户端与服务端协商密码套件, 主要是从客户端支持的加密方式中选择一个合适的告诉客户端。

该密码串的含义

ECDHE:密钥交换算法 ECDSA:身份验证 AES_128_CBC:用于消息加密的批量密码 SHA:MAC 算法

在 Web 服务器上安装 HTTPS

对于不同类型的服务器,在 Web 服务器上配置 HTTPS 相对简单,并且有详细的文档记录。

设置的主要步骤是:

  • 向证书颁发机构订购 SSL 证书
  • 在 Web 服务器中安装证书(要复制到服务器的文件)
  • 配置网络服务器

服务器的配置可能包括:

  • 证书绑定的IP地址-端口/域名
  • 激活协议的配置(TLS/SSL)
  • 算法和密码密钥大小的配置(密码套件)
nginx 复制代码
server {
    listen 443 ssl;
    server_name xxx;

    ssl_certificate /cert/xxx.crt;
    ssl_certificate_key /cert/xxx.key;

    location / {
        proxy_pass http://localhost:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

可以在下面找到详细说明如何在三个主要 Web 服务器上安装 SSL 的文档链接: Apache: wiki.apache.org/httpd/SSL IIS: www.iis.net/learn/manag... Nginx: nginx.org/en/docs/htt...

Mozilla 发布了一个站点,你可以在其中生成安全的 HTTPS 配置:

Mozilla SSL 配置生成器

保持 HTTPS 更新为最新

HTTPS 配置不是一次性事件。安装后,必须保持其配置最新。 很多bug都会影响一些较低版本的openSSL库(例如Heartbleed), 系统更新可以帮助避免一些与 HTTPS 使用直接相关的漏洞。

此外,有必要随时了解不同协议和密码套件的安全性。这里的目标是在某些时候被认为较弱的情况下停用其中一些。

最后一点也是很重要的,也是很明显但经常被遗忘的:证书过期。一旦证书过期,网络浏览器将显示非常具有劝阻性的安全警报,鼓励用户离开网站。

相信大家在浏览网站的时候遇到过这样的情况

HTTPS 不做什么

人们很容易认为 HTTPS 是一个神奇的互联网安全解决方案,但它还有很多不能做的事情。

HTTPS 不会:

  1. 隐藏你正在访问的网站的名称

这是因为网站的名称(又名"域")是使用 DNS(域名服务)发送的,而 DNS 不在 HTTPS 隧道内。它在建立安全连接之前发送。中间的窃听者可以看到你要访问的网站的名称(例如 TipTopSecurity.com),他们只是无法读取来回传输的任何实际内容。直到DNSSEC完全实施后,这种情况才会改变。

  1. 保护你免受访问邪恶网站的侵害

HTTPS 不能确保网站本身的安全。仅仅因为你安全连接并不意味着你没有连接到由坏人运行的网站。我们尝试通过受信任的证书颁发机构来解决此问题,但该系统并不完美(请继续关注有关此方面的更多信息)。

  1. 提供匿名

HTTPS 不会隐藏你的物理位置或个人身份。你的个人 IP 地址(你在互联网上的地址)必须附加到加密数据的外部,因为如果你的 IP 地址也被加密,互联网将不知道将其发送到哪里。而且它也不会在你正在访问的网站上隐藏你的身份。你访问的网站仍然了解你的一切,就像在非安全连接上一样。

  1. 防止你感染病毒

HTTPS 不是过滤器。有可能通过 HTTPS 连接接收病毒和其他恶意软件。如果 Web 服务器被感染或者你所在的恶意网站正在分发恶意软件,则该恶意软件将像其他所有内容一样在 HTTPS 流中发送。然而, HTTPS确实可以防止中间的任何人将恶意软件注入到你的移动流量中。

  1. 保护你的计算机免遭黑客攻击

HTTPS 仅保护在你的计算机和 Web 服务器之间移动的数据。它不会为你的实际计算机或服务器本身提供任何保护。这也意味着,如果有恶意软件正在监视连接一端的流量,它就可以读取 HTTPS 流中加密之前和之后的流量。

更多一手讯息,可关注公众号:ITProHub

相关推荐
hai4058727 分钟前
Spring Boot中的响应与分层解耦架构
spring boot·后端·架构
Adolf_19932 小时前
Flask-JWT-Extended登录验证, 不用自定义
后端·python·flask
叫我:松哥2 小时前
基于Python flask的医院管理学院,医生能够增加/删除/修改/删除病人的数据信息,有可视化分析
javascript·后端·python·mysql·信息可视化·flask·bootstrap
海里真的有鱼2 小时前
Spring Boot 项目中整合 RabbitMQ,使用死信队列(Dead Letter Exchange, DLX)实现延迟队列功能
开发语言·后端·rabbitmq
工业甲酰苯胺2 小时前
Spring Boot 整合 MyBatis 的详细步骤(两种方式)
spring boot·后端·mybatis
新知图书3 小时前
Rust编程的作用域与所有权
开发语言·后端·rust
小黑爱编程3 小时前
【LInux】HTTPS是如何实现安全传输的
linux·安全·https
wn5314 小时前
【Go - 类型断言】
服务器·开发语言·后端·golang
希冀1234 小时前
【操作系统】1.2操作系统的发展与分类
后端
GoppViper4 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理