白话 HTTPS

本贴最后更新于 508 天前,其中的信息可能已经事过景迁

最近研究了一番 https 的知识,总结如下,为了更好的让零基础用户理解,下面用最直白的话描述,可能不够严谨,但能帮助理解。

水平有限,不足之处,还请高手多多指点!

在早期,客户端(这里指浏览器)和服务器之间(这里指 http 服务器)传输数据是明文传输的,这就是 http 协议。这有个缺点,任何人都可以通过抓包拦截网络传输中的数据包,甚至拦截后重发,这很不安全。

后来有聪明的人提出了加密,所谓加密就是通过一个密钥(通常是一个密码一样的字符串,通常由浏览器生成),然后通过某种算法对数据进行打乱,只有知道密钥的人才能解密这段数据,这通常叫做对称加密。

但,又有聪明的人提出了,想法很好,但你的密钥怎么告诉服务器,密钥传输中也可能被拦截,这样,别也知道你的秘钥了,加密还有什么用。

这就很尴尬了,后来又有一个更聪明的人,提出了一种加密算法,就是秘钥不是有一个,而是两个,一个加密,另一个解密,这两个秘钥通常称为公钥和私钥,而这种加密方式称为非对称加密,通常公钥用于加密,私钥用于解密,但在签名场景则通常私钥加密消息摘要,生成签名,而公钥解密签名,获取消息摘要。总之,有了这种加密算法,就可以用这种加密算法把对称加密密钥进行加密后再传给服务器,这样就解决了对称密钥被窃取的风险。

但问题又来了,怎么把私钥和公钥传给服务器或者说两者该怎么协商呢,仍然没能解决上面说的秘钥被拦截问题,而浏览器也不是针对一家服务器,不可能事先与你协商秘钥。

后来,又有大聪明提出了一个想法,通过第三方机构,没错,这个有点像支付宝担保支付,找一家大家都信任的第三方进行担保,这就是所谓的第三方证书颁发机构,那么这个颁发的证书中包含了一系列信息,包括个人或组织信息,域名,第三方机构等信息,当然也包含公钥,这就是所谓的安全证书。

当你想搭建一个 https 的网站时,你先要去第三方机构去申请安全证书(通常通过证书颁发网站申请),申请前先用 OpenSSL 生成私钥,然后用这个私钥生成 CSR,CRS 中包含公钥以及关于您的域名、组织信息等,然后把 CSR 发给颁发证书网站,然后安全证书网站会对你的个人或组织信息及域名等进行验证,验证通过后,会生成一个安全证书给你,证书中包含证书公钥和 CA 签名(签名主要为了防止证书被篡改)。注意,有些第三方机构(比如某云平台)为了降低用户使用难度可能会自动帮你生成 CSR 文件,你只需要填写资料申请,验证域名,颁发,下载证书相关文件即可。这个相关文件是因为下载的文件里包含了证书和私钥,没错,云平台帮你生成了私钥,严格意义上说这不够安全,当然,一般这个文件通常只有用户自己的账号才能访问,相对是安全的,要说不安全那你的文件还放在平台呢。

然后,你需要把证书(通常是 crt 文件)和私钥(通常是 key 文件)放到服务器,并在 http 服务器中进行配置,这样,当浏览器请求你的网站时,服务器会把证书及证书公钥发送给浏览器。浏览器拿到证书后,会做两件事,第一,根据证书去验证证书的可靠性,包括机构是否受信任,证书是否过期,是否和域名匹配等,第二件事,如果第一件事验证通过,则随机生成一个对称加密的密钥,然后用证书公钥进行加密,然后发送给服务器,由于这个密钥被非对称加密了,除了拥有证书私钥的人(即服务器外),无人能解密,这样就保证了传输的安全性。

然后,服务器收到浏览器发送过来的密钥后,通过证书私钥进行解密,然后就拿到对称密钥了。然后服务器发送数据给浏览器时就可以通过这个对称密钥进行加密了,而浏览器也可以通过这个密钥进行解密,自己发过去的密钥自己自然知道了。这样就保证了数据传输过程中的安全。

有时你也可能或见到 .p12 文件,它包含了证书和私钥,通常会使用密码进行加密,以增加安全性。这意味着需要提供密码才能从中提取证书和私钥。这种格式的文件通常用于需要将证书和私钥一起打包和分发的场景,例如移动应用开发、桌面应用程序配置等。

下面是 https 验证过程示意图

image

问题列表:

  1. 浏览器是怎么验证证书是可靠的呢?

    浏览器预先安装一系列受信任机构的根证书,这些根证书是颁发机构自己生成的用于验证自己身份的证书。当你向颁发机构申请证书时,颁发机构会用根证书或中间证书(由根证书直接或间接签名的证书)给你的证书进行签名。而当浏览器访问您的网站时,它会检查你的证书是否由一个已知的、受信任的根证书所签名。这样就形成了一条信任链,从最终用户证书到中间证书再到根证书。

  2. 什么是签名?什么是验签?消息摘要为什么加密?

    签名是防止数据被篡改的手段。比如,你需要给浏览器发送数据,在发送前,你先通过 hash 算法,给你的数据生成消息摘要(消息摘要就是把数据生成固定长度的字符串,每次生成都一样),然后用私钥给消息摘要进行加密,生成签名,发送时,把数据和签名及公钥一起发送,浏览器拿到这些数据后,通过公钥对签名进行解密,获取消息摘要,然后再通过对数据进行生成消息摘要,然后对比这两者的消息摘要是否一致,来确认数据是否被篡改。

    这里细心的朋友发现,这公钥是公开的,任何人都可以解密签名获取摘要,还有什么用?这里主要是消息摘要加密后,即使窃取者解密了,但他无法篡改数据,因为篡改了数据后,窃取方没有私钥,无法生成新的签名,如果附加假的签名或用原签名,验签都无法通过。而如果摘要不加密,那么窃取者可以篡改数据,并附加新的摘要,而接收方无法知道数据是否被篡改,以及是否发送方发送的数据,无法保证数据的安全。

  3. 我可以自己生成根证书吗?

    是的,你可以通过 OpenSSL 给自己生成根证书,然后再给服务器生成证书,然后用你的根证书签名,然后把根证书导入浏览器即可。

  4. 既然公钥和私钥都可以加密解密,公钥和私钥可以互换吗?比如私钥公开,公钥保密。

    不可以互换,因为私钥可以生成公钥,如果私钥公开,那么别人通过私钥可以生成公钥,因为私钥和公钥一一对应的,多次生成公钥的结果是一样的,这样就相当于你公钥和私钥都公开了。

  5. 既然公钥和私钥可以加密解密了,传输数据为什么不用公钥和私钥加密,还加个对称加密干嘛?

    因为性能问题,对称加密性能更高,这样既保证了数据的安全传输,又不会因为加密过程而大幅增加计算负担。

  6. 对称加密和非对称加密算法有哪些?

    对称加密算法
        DES (Data Encryption Standard)
        AES (Advanced Encryption Standard)
        3DES (Triple DES)
        RC4 (Rivest Cipher 4)
        Blowfish
    非对称加密算法
        RSA (Rivest-Shamir-Adleman)
        DSA (Digital Signature Algorithm)
        Diffie-Hellman Key Exchange
        ECC (Elliptic Curve Cryptography)
    
  • HTTPS
    100 引用 • 275 回帖 • 3 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 403 关注
  • 开发
    43 引用 • 159 回帖 • 2 关注
2 操作
wilsons 在 2024-07-31 19:43:06 更新了该帖
wilsons 在 2024-07-31 10:53:04 更新了该帖

相关帖子

3 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • wilsons

    关于公钥和私钥和数字证书之间的关系补充:

    有人说私钥里已包含公钥的说法是错误的,而是私钥和公钥之间在一种数学上的关系,使得可以从私钥计算出公钥,注意,这里是计算,并不是私钥中包含公钥。

    当你生成一对非对称密钥时,通常是从随机数产生私钥,然后利用该私钥以及特定的算法(如 RSA、ECC 等)来计算出对应的公钥。这个过程是单向的,意味着可以从私钥计算出公钥,但反过来则不行。

    所以,知道私钥可以很容易地计算出公钥,但反过来却非常困难(理论上说是不可能的)。

    另外,有网友说,ca 颁发的私钥里已包含公钥,这种描述也是不准确的,应该是 ca 颁发的数字证书里已包含公钥,实际上,私钥和公钥都应该由用户自己生成,CA 不会直接发放私钥,而是验证用户的身份后为其生成的公钥签发数字证书。用户自己保留私钥,而公钥则被包含在数字证书中,并由 CA 签名确认其有效性。所以,这里的公钥和私钥都是用户自己生成的,数字证书里的公钥是用户通过 CSR 文件上传给 ca 机构的。

    不过,像某某云,他们为了让用户更易操作,只需填写资料并验证域名后,会自动为用户生成私钥及数字证书,然后下载下来。但这并不是私匙里已包含公匙,私钥里并不包含私钥,而是存在一定的数学关系,可以计算出公钥,更不可能直接从中提取。

    而数字证书中却包含有公钥,可以提取出来。

    比如:数字证书中包含如下信息等

    • 证书持有人信息:包括姓名、组织名称、所在城市、国家代码等。
    • 公钥:与证书持有人关联的公钥。
    • 有效期:证书的有效开始和结束日期。
    • 颁发者信息:证书颁发机构的名称。
    • 数字签名:使用颁发者的私钥对证书内容进行加密的数字签名,以确保证书的完整性和真实性。

    另外,这里多说一句,数字证书和 ca 证书是不一样的,简单来说 ca 证书是 ca 机构颁发给自己的,用于证明自己的身份,浏览器中预装的是 ca 证书(ca 根证书)。而数字证书是颁发给用户的,广泛应用于各种场景,包括网站服务器、电子邮件、软件签名等,以证明持有者身份和公钥的所有权。

    一般数字的证书验证过程是从用户证书到中间 ca 证书到根 ca 证书。

    因为,一般用户的证书都不会直接由根 ca 机构颁发,大多数是中间 ca 机构颁发,那么,对于大多数证书验证过程,是从最终用户证书 -》中间 CA 证书 -》根 CA 证书,这样就构成了一条信任链,因为这些证书都被根证书直接或间接的签了名,形象点说就是官方已认证盖章。

  • 其他回帖
  • wilsons

    感谢指出错误,已修改。

  • muxue 1

    这就很尴尬了,后来又有一个更聪明的人,提出了一种加密算法,就是秘钥不是有一个,而是两个,一个只能加密,可以给浏览器,称为公钥,一个只能解密,可以给服务器,称作私钥。然后用公钥加密数据,私钥解密数据,这样只要别人不知道私钥就无法解密数据了,这称为非对称加密。

    有误,私钥和公钥都能进行加密和解密,和对称加密的区别在于,非对称加密中,私钥加密内容只能被公钥解密,公钥加密的内容只能被私钥解密。所以,当浏览器收到一条消息,能用该服务器提供的公钥解密时,代表发送方一定是私钥持有方,即服务器本身。然后才是通过 CA 机构的认证和数字签名来判断收到的这个公钥有没有被篡改,证书信息和当前访问的域名是否匹配。

    1 回复
wilsons
正式入驻知乎了,以后新贴主要在这里。 欢迎大家订阅关注! 你的关注对我是莫大鼓励,也能让我持续产出优质内容,我们一起成长 🙏 点这里立即关注:https://www.zhihu.com/people/wilsonses

推荐标签 标签

  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 1 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 403 关注
  • 微信

    腾讯公司 2011 年 1 月 21 日推出的一款手机通讯软件。用户可以通过摇一摇、搜索号码、扫描二维码等添加好友和关注公众平台,同时可以将自己看到的精彩内容分享到微信朋友圈。

    135 引用 • 798 回帖 • 2 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    14 引用 • 84 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    308 引用 • 773 回帖
  • Visio
    1 引用 • 2 回帖 • 1 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    174 引用 • 414 回帖 • 344 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 350 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 458 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 636 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    71 引用 • 535 回帖 • 847 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 724 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • sts
    2 引用 • 2 回帖 • 260 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 702 关注
  • 分享

    有什么新发现就分享给大家吧!

    251 引用 • 1801 回帖 • 1 关注
  • JVM

    JVM(Java Virtual Machine)Java 虚拟机是一个微型操作系统,有自己的硬件构架体系,还有相应的指令系统。能够识别 Java 独特的 .class 文件(字节码),能够将这些文件中的信息读取出来,使得 Java 程序只需要生成 Java 虚拟机上的字节码后就能在不同操作系统平台上进行运行。

    180 引用 • 120 回帖 • 1 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    34 引用 • 333 回帖 • 1 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    201 引用 • 120 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 1 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 565 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    110 引用 • 153 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 429 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    6 引用 • 35 回帖
  • RYMCU

    RYMCU 致力于打造一个即严谨又活泼、专业又不失有趣,为数百万人服务的开源嵌入式知识学习交流平台。

    4 引用 • 6 回帖 • 56 关注