花了一年半的时间,写了一本书《深入浅出HTTPS:从原理到实战》,目前已经可以购买了,对密码学和 HTTPS 感兴趣的同学可以关注下。
这篇博文是本书的前言,解释了我和这本书的渊源、写书的原因、写作过程中的一些心得体会、包括本书的章节设置等等。
2012年,我第一次接触到 HTTPS 协议,那时候 HTTPS 网站还没有大规模部署,当时想给自己的博客部署一张 HTTPS 证书,由于免费证书很少,最后花了近一个月才搞定,喜悦之情可想而知。
完成 HTTPS 网站部署后,特别想了解 HTTPS 协议的背后原理,自己就在网络上寻找相关的资料,让人沮丧的是国内的 HTTPS 资料非常少,大部分都是一些零星的知识,没有系统性的介绍,而且很多信息非常不严谨,不同人对于同一个知识点的描述也存在差异,由于自己没有十足的学习动力,初次学习之旅就结束了。
2016年,HTTPS 协议又一次进入了我的视野,主要有二点原因,第一就是当时公司产品经常遇到页面篡改攻击,就想部署 HTTPS 网站解决该问题,完成工作后,自己想进一步掌握 HTTPS 原理。第二就是自己使用 Shadowsocks 协议搭建了一个代理服务,很好奇 Shadowsocks 协议的加密原理,当时隐隐约约觉得 HTTPS 协议和 Shadowsocks 协议背后原理应该是相通的。
为了系统学习 HTTPS 协议,自己再一次搜索相关的中文资料,情况和2012年差不多,中文资料还是非常少,质量也参差不齐,比较好的资料来源于 imququ.com,虽然 imququ.com HTTPS 相关文章并不是特别多,但描述的非常好,而且具有实践性。
国内 HTTPS 比较好的资料来自各大 CDN 公司,因为未来 HTTPS 网站部署和优化是非常重要的一个研究方向,CDN 公司为了减少成本和提升性能,必然会进一步研究 HTTPS 协议。但必须指出他们的文章更多是宣介自己的产品,并没有诚意十足的分享。
第二个学习方式就是寻找专业的 HTTPS 书籍,正好《HTTPS权威指南》出版了,这本书应该算国内第一本 HTTPS 书籍,所以第一时间就购买了,这本书翻译之《Understanding and Deploying SSL/TLS and PKI to Secure Servers and Web Applications》,目前看来这本书并不适合于初学者,原因在于本书主要讲解 HTTPS 协议漏洞,协议原理、网站部署等内容篇幅非常少,确切的说,这本书更适合了解 HTTPS 协议原理的读者,但不可否认这是一本好书。
经过一段时间的摸索,我意识到学习 HTTPS 协议必须参考更多的英文资料,向读者推荐两本,分别是《Implementing SSL/TLS Using Cryptography and PKI》和《Network Security with OpenSSL: Cryptography for Secure Communications》,这两本书虽然出版时间比较早,很多知识点比较成旧,但直到现在,仍然是非常权威和专业的 HTTPS 书籍。
很多读者可能已经发现,这两本书书名并没有任何的“HTTPS”字样,关键词是“SSL/TLS”和“OpenSSL”,此处重点解释 HTTPS 协议和 TLS/SSL 协议之间的关系。对于读者来说,重要的是掌握 TLS/SSL 协议原理,HTTPS 协议其实是 TLS/SSL 协议的一个最重要的子应用,任何讲解 HTTPS 协议的书籍和资料,其实都是在讲解 TLS/SSL 协议,希望读者明白两者之间的关系,对于学习至关重要。
我也非常困惑为什么专业的 HTTPS 书籍如此至少,不像编程语言那样火爆,偏小众。为了进一步学习,我使用 Google 搜索、Wikipedia、Stack Overflow 进行了大量的学习,找到了很多非常不错的资料和网站(比如 blog.cloudflare.com、Qualys SSL Labs),逐渐形成了自己的知识体系。让我认识到 HTTPS 学习的四个关键步骤,分别是密码学、OpenSSL、TLS/SSL 协议、HTTPS 协议,可见整个体系知识还是非常庞大的。
在学习之余,我也非常重视实践和总结,在博客上写了一些关于 HTTPS 协议方面的文章,没想到访问量还是非常不错的,可见很多人也非常关心 HTTPS 网站的部署,进一步增加了我的学习动力,但客观的说,此时自己掌握的知识还不成体系,研究的也并不深入。
2017年年初,博文视点的董英主编询问我是否能写一本专业的 HTTPS 书籍,当时潜意识有两个反应,第一就是挺激动的,对于自己来说,写书还是遥远的一件事情。第二就是婉拒写书,因为写博客和写书是完全不同的,写书最重要的就是严谨和专业性,自己并没有十足的把握将整个体系描述清楚,也不想误导于人。
此时董英主编说的一句话,让我还是非常有触动的,她说“你只要认真分享就可以了,不要过于有压力”,这句话听上去很简单,但激发了我的原始动力。
我重新思考写书这个事情,为什么不突破下自己呢?因为这是一个新的尝试,写书和写博客一样,是非常好的一种学习方式;既然国内 HTTPS 专业书籍如此之少,为什么不分享呢?这是一种非常好的信息输出方式;写的不好会不会被人批评呢?自己意识到只要用心去写,就一定能写出一本好书,即使书中存在错误,但自己尽了百分之百的努力,相信读者也会宽容的。
由于自己从没写过书,所以就告诉董英主编,自己打算花一个月时间思考书的整体框架,如果觉得合适就去写,如果觉得目前无法掌控就放弃,幸好,最后还是写了这本书。
这一个月花费了我大量的精力,一直在思考这几个问题,本书的对象是谁,如何让他们看明白呢?如何系统化的把 HTTPS 协议将清楚;书籍是偏理论、实战还是两者兼而有之;如何组织书的目录结构呢,每一章的顺序排列依据是什么呢?为了更好的说讲清楚,自己还要学习那些知识?
这些问题几乎天天都在思考,最后抓住了两个关键点,第一就是根据自己理解程度去写,不浮夸,重实践;第二就是以一个初学者的角度去写书。
在写这本书之前,定了几个基调:
即使一个人从没听说过 HTTPS 协议,也能看明白这本书,并且学以致用。
循序渐进,由浅入深,充分考虑每个人的学习规律,每章之间都有关联,并不会跳跃。
重理论、重实践,既能学到原理知识,又能够进行实践,从而巩固学习成果。
注重引导和启发,比如密码学自己掌握的并不够,所以不会着重描写,但框架一定要清晰,以便读者进一步学习。
通俗,希望本书容易理解,尽量减少读者的学习难度。
本书的撰写过程是我第三次 HTTPS 学习之旅,从动笔到完成初稿,整整花了一年多的时间,每天至少花费5个小时用于研究和写书,越往后写,越觉得 TLS/SSL 协议知识体系是如此庞大,需要研究很多领域,有几次差点放弃,但最终还是坚持下来了。
写作最大的动力还是来源于内心,内心渴望将 HTTPS 知识分享出来,为了提升书的质量,尽可能的去寻找更多的资料,有的时候为了论证一个观点,需要花费好几天,不断的研究 RFC 文档,不断查看 OpenSSL 源代码,只为让自己的描述更严谨,更准确。
在具体写作的时候也遇到了很多挑战,有些章节写完之后,个人感觉非常不好,考虑到读者看了后可能会更迷惑,遇到这种情况就会选择重写,或者以另外一个角度重新组织语言。一本书的结构非常重要,直接影响用户的理解,自己花了很长的时间去组织,不断的去调整,不断的换位思考,直到自己满意为止。
客观的来说,整个写书过程还是非常煎熬的,周围的同事和朋友对于 HTTPS 协议知之甚少,自己在遇到问题的时候,只有默默的去专研,就像大海中的一片孤叶一样,只有靠自己才能游到岸边。
所幸,老婆和闺女给了我很大的动力,每天清晨起床写书的时候,看着她们在安宁的睡觉,心里默默有一股暖意,我需要为她们付出更多,写完一本书就是最好的行动。
第二个最主要的体会就是学习理解能力得到了极大的提升,对技术理解也更加深刻,相对来说 HTTPS 知识还是比较冷门的,学习过程很坎坷,不像编程语言,有大量的书籍和社区,过程会相对轻松。
在这个过程中,也意识到自己并不是在学习 HTTPS 知识,而是在学习密码学安全知识,在所有技术领域中,密码学看似不重要,但却是非常关键的一环,就像学习 TCP/IP 协议、操作系统等知识一样,都是一个搭建基础的过程,掌握好密码学和 TLS/SSL 协议,未来再转入其他领域,就会更加得心应手,比如现在流行的区块链技术其背后就是密码学知识。
在这个过程中,自己的学习方法论也得到了提升,对于 HTTPS 知识来说,RFC 和 OpenSSL 官方文档可能是最权威,最专业的渠道,但这些文档有个通病,描述的非常枯燥,需要静下心来仔细专研,才能够掌握知识的精髓,而一旦打通这个环节,得到的收益将是巨大的。
写完这本书后,我再一次思考,意识到这本书绝对不是自己 HTTPS 学习的终点,因为 HTTPS 协议体系越来越重要,也涌现了很多相关的技术,比如 TLS v1.3 协议越来越成熟,可本书并没有涉及相关的知识点;再比如在编写本书的时候,谷歌宣布废弃 HPKP 技术,可见整个 HTTPS 技术体系还在不断的完善,我还会继续深入研究。也会以这本书为基点,通过博客的形式分享给对 HTTPS 感兴趣的人。
最后,必须说明一点,个人对于 HTTPS 协议的理解还有非常大的提升空间,比如对于密码学的原理掌握的并不够,所以本书在描述的时候,更偏重密码学应用讲解,而非密码学底层算法讲解。
同时个人没有在专业的 CDN 公司工作过,无法接触到更多的 HTTPS 优化实战,没有在不同硬件上系统测试过密码套件的性能,也没有深入研究过 OpenSSL 源码,未来我会继续在这一领域深蕴。
总之,这是我的一本用心之作,希望读者能够以宽容、理解、帮助的心态对待这本书和我。
首先回答为什么要掌握 HTTPS 协议,确切的说为什么要掌握 TLS/SSL 协议,未来互联网安全是非常重要的一个领域,而安全背后的核心就是密码学算法,TLS/SSL 协议组合了大部分密码学算法,掌握了 TLS/SSL 协议,一定程度上等同理解了密码学。
TLS/SSL 协议重要性不言而喻,能够解决互联网中所有普适性的安全问题,只要提到安全,脑海中第一个印象就是思考是否能引入 TLS/SSL 协议,是否有专门的密码学算法解决,掌握了密码学知识和 TLS/SSL 协议,学习安全领域的知识将非常轻松。
总结一点,只要您是一个开发者,密码学和 TLS/SSL 协议必须掌握,对您的帮助将是极大的。
其次为什么要选择这本书呢?
(1)本书是国内第一本 HTTPS 原创书籍,也是我的用心之作,就像工作一样,态度有的时候比技能更重要,在写本书的时候,我倾注了很多精力,借鉴了很多资料,对自己所有的观点都通过实例进行了论证,最后以自己的方式将知识分享给读者。
(2)我在 Web 领域开发了十余年,深刻明白 Web 技术体系的精髓,也明白什么知识才是最核心和重要的,通过本书,我将自己的方法论分享给读者,本书不仅仅是描述知识,更希望是学习知识的一扇大门,读者在阅读的时候应该思考我为什么如此讲解,希望读者完成阅读后,能够有所体会,并进一步学习 HTTPS 知识。
(3)本书尽量描述一些真正实用的知识,比如不会描述类似 TLS v1.1 版本的知识,因为它已经过时了;对于读者来说,可能更想对 HTTPS 网站进行调优,本书参考了很多最佳实践,提出了很多中肯的建议;很多读者部署 HTTPS 网站的时候,想寻找免费的证书,为此我花费很长时间研究 Let’s Encrypt 和 Certbot,相信阅读本书后,证书申请不再是难题。
(4)本书的知识也很前沿,很少有书籍和资料基于 TLS RFC 文档详细讲解,本书用很多的篇幅从 FRC 角度讲解,最后还采用 Wireshark 工具对协议进行了解剖,让读者直观了解协议是如何握手以及交互。
(5)本书也充分考虑读者的实际情况,掌握 TLS/SSL 协议必须了解基础的密码学知识,否则学习的时候会非常煎熬,但密码学原理非常难于学习,针对这个情况,本书从应用的角度而非原理的角度讲解密码学知识,为了避免学习枯燥,使用 OpenSSL 命令行工具讲解算法应用,本书处处可见 OpenSSL 命令行工具,非常具有实践性。
(6)在写这本书的时候,我尽量使用最精确的语言,很注意书写的流畅性,避免干扰读者的理解,可以说我是本书的第一阅读者,每时每刻都从读者的角度去解读。
总之,本书充分考虑了读者的需求,将真正有用的知识分享给大家,这也是本书最重要的价值,如果想系统学习 HTTPS 知识,阅读本书是最好入门方式,而选择本书并不会存在语言鸿沟,是通往 HTTPS 学习之路最好的一扇大门。
那么什么样的技术人群适合阅读本书呢?只要你是一个开发者,曾经进行过 Web 开发(最好了解 PHP 开发,因为本书使用了一些 PHP 示例),同时具备一定的 Linux 操作知识(比如了解 Shell,了解 Nginx 服务器安装),那么阅读本书不会存在任何障碍。
阅读本书的人群主要如下:
Web 开发者,包括前后端开发人员。
网站运维人员。
Web 系统架构师。
任何想了解密码学、OpenSSL、HTTPS 知识的人群。
致力于安全领域的开发者。
结构性是一本书的精髓,我在挑选书籍的时候,第一步就是了解目录结构,从中可以看出作者的思路以及书的特点,从而判断现阶段是否适合阅读本书。
所以在编写本书的时候,对书的目录结构做了精心的设计,前后调整了好几次,充分考虑了读者的阅读习惯。
本书的每一章相对来说是独立的,可以跳跃式的阅读,同时每一章之间又是有关联的,每一章都有承上启下的作用,使用由浅入深的方式讲解。
如果想系统性的学习 HTTPS,建议按照本书的目录结构从前往后阅读,这样就能全面掌握知识的脉络。
本书共分为十章,了解下每章的大概内容。
(1)第一章
HTTPS 协议主要是为了解决 HTTP 协议的安全问题,所以本章首先回顾了 HTTP 协议的基础知识,以及不安全的根本原因。同时 HTTP 协议是 TCP/IP 协议族最重要的应用层协议,必须了解 TCP/IP 协议的基本原理和框架。最后必须明白 Web 安全和 HTTPS 协议安全是两个完全不同的领域。
(2)第二章
HTTPS 协议的背后的核心其实是密码学算法,所以本章介绍了很多常用的密码学算法,对算法的关键概念进行了讲解,同时为了避免学习枯燥,以 OpenSSL 工具和 PHP 语言去讲解密码学算法。密码学算法非常关键,读者阅读本书后,建议找专业的密码学书籍进行学习。
(3)第三章
本章介绍了几个关键概念,首先需要明白 HTTPS 协议其实是 TLS/SSL 协议的子应用,重点是学习 TLS/SSL 协议。 本章以抽象的形式解释了 TLS/SSL 协议的基本特点和工作原理。对于读者来说,可能更关心如何搭建一个 HTTPS 网站,所以本章也介绍了实施 HTTPS 网站的必备条件。最后以用户的角度,让他们明白什么是 HTTPS 协议,如何知晓访问的网站是安全的。
(4)第四章
本章非常的轻松,没有太多的技术知识点,不同角色对于 HTTPS 协议的理解也是不同的,关于 HTTPS 协议的必要性和疑惑做了进一步的描述。
(5)第五章
在了解 HTTPS 基本工作原理后,读者希望快速搭建一个 HTTPS 网站,可以根据本章的内容搭建一个 HTTPS 网站,涉及的内容包括证书申请、服务器部署、全站 HTTPS 策略的三个关键技术。阅读本章的时候,可以回顾第三章的内容。
(6)第六章
本章介绍证书的核心概念,证书虽然不是 TLS/SSL 协议的一部分,但 HTTPS 必须引入证书才能保证绝对的安全。本章介绍了证书的结构、属性、扩展,并全面介绍了证书背后的密码学原理,而掌握证书必须了解证书链的校验原则。本章中段介绍了证书的三个关键技术(CRL、OCSP、OCSP 封套),它们是证书的有效补充。本章精华部分就是通过 OpenSSL 命令行工具对证书进行管理,比如查看证书结构、创建 CSR 文件、导入导出根证书、获取证书等等。
(7)第七章
对于读者来说,部署 HTTPS 网站最大的难题就是证书申请,而 Let’s Encrypt 是一个免费的 CA 机构,可以申请免费证书,所以本章重点讲解了 Let’s Encrypt 工作原理,以及全面讲解 Certbot 客户端的使用。本章可以结合第六章一起阅读,可以全面掌握证书的内容。同时证书和 TLS/SSL 协议不是孤立存在的,其背后的密码学原理是相通的。
(8)第八章
本章是本书的核心,根据 RFC 文档详细讲解了 TLS/SSL 协议细节,主要包括握手协议、协议扩展、会话恢复等细节。而为了更直观的掌握协议原理,使用 Wireshark 网络工具解剖协议消息,读者可以从多个角度掌握协议。
(9)第九章
本书最后两章主要讲解 HTTPS 协议最佳实践策略,本章讲解读者最关心的两个问题,分别是如何提升 HTTPS 网站性能,如何部署更安全的 HTTPS 网站。不管是协议性能还是安全性,密码套件是其中最关键的概念,所以本章花了很多的篇幅介绍密码套件的概念、特点。
(10)第十章
本章是最佳实践的后半部分,介绍了很多工具和网站,实践性非常强,主要介绍了 Cloudflare 和 Mozilla 推荐的两个工具,通过这两个工具,能够搭建出非常棒的一个 HTTPS 网站。本章第二部分主要讲解 HTTPS 网站测试工具,首推就是 SSL Labs 工具包,建议读者重点关注该网站。本章第三部分系统介绍了 OpenSSL 命令行工具,学习 TLS/SSL 协议最好的工具其实就是 OpenSSL,很多 HTTPS 工具都是对 OpenSSL 命令行的进一步封装。本章第四部分介绍了如何在 Nginx 服务器上配置 HTTPS 网站,详细介绍了 ngx_http_ssl_module 模块的各个指令。本章最后一部分描述大型网站如何部署有效地进行部署、优化。
本书用到了很多示例,主要包含 PHP 代码片段、Nginx 服务器配置、OpenSSL 命令行,Wireshark pcap 文件。
所有的示例都存放在 Github 上(https://github.com/ywdblog/httpsbook)上,每章一个目录,读者很容易根据书的描述找到示例。
如果读者运行错误,可能有以下几个原因:
对于 PHP 脚本来说,依赖性比较小,所有代码都运行在 PHP 5.3.3 (cli) 版本下,如果不能成功运行,可能是读者的 PHP 版本过高。
关于 Nginx 配置,本书第十章主要描述了相关配置,在 nginx 1.13.5 版本下测试通过,读者在测试的时候请注意 Nginx 版本。
TLS/SSL 协议和 OpenSSL 库在不断升级,如果读者在运行 OpenSSL 命令行示例的时候,需要注意版本,示例只是一个参考,遇到问题,建议重点参考手册。
示例只是为了协助学习,对于读者来说,更重要的是掌握书中描述的知识,然后不断的实践,从而真正灵活使用。
再一次重申,本人水平有限,对于 HTTPS 协议的研究时间也不长,所以难免会出现理解错误和书写错误,希望读者报以宽容的心态对待本书。而对于我来说,更希望得到大家的反馈,如果读者在阅读过程中发现任何错误,都可以去 https://github.com/ywdblog/httpsbook 提交 Issue。同时如果有好的建议或者问题也可以直接提交 Issue 或者发送邮件至 ywblog@outlook.com,我会及时并尽力去答复。
本书所有的勘误修正全部放在 https://book.simplehttps.com/errata.md 文件中,欢迎大家尽量指出本书的错误,这是对我最大的支持。
写完本书后,我考虑到国内 HTTPS 知识非常少,也不成体系,所以专门申请了一个域名(simplehttps.com),希望构建一个良好的知识学习平台,具体的运作形式还没想好,欢迎大家给我一些建议。初步的设想就是汇众一些博客文章和资料,作为学习 HTTPS 知识的一个入口。
如果你想长期了解本书的情况,可以扫描下面的二维码。
京东购买:https://item.jd.com/12382462.html
当当购买:http://product.dangdang.com/25291819.html
如果你想长期关注本书的情况,可以访问我的公众号(yudadanwx)
也可以访问 www.simplehttps.com
微信扫一扫
关注该公众号