在2020年,您的网站没有理由不使用HTTPS。访客期望它,Google将其用作排名因素,浏览器制造商很乐意于点名那些没有使用它的网站。在本教程中,我将引导您通过一个实际示例,
说明如何将Let's Encrypt生成的证书添加到Express.js服务器。但是,仅使用HTTPS保护我们的网站和应用程序还不够。我们还应该要求正在与之通信的服务器进行加密连接。我们将看到有可能激活SSL / TLS层,即使默认情况下未启用它也是如此。
注意:如果您在配置NGINX作为Node应用程序的反向代理时正在寻找有关如何使用NGINX设置SSL的说明,请查看我们的快速提示“ 使用Node.js配置NGINX和SSL ”。
让我们从简短回顾一下HTTPS的当前状态开始。
一、HTTPS无处不在
HTTP / 2规范于2015年5月以RFC 7540的形式发布,这意味着它是该标准的一部分。这是一个重要的里程碑。现在,我们都可以将服务器升级为使用HTTP / 2。最重要的方面之一是与HTTP 1.1的向后兼容性以及选择不同协议的协商机制。尽管该标准未指定强制加密,但是当前没有浏览器支持未加密的HTTP / 2。这给HTTPS带来了另一个提升。终于,HTTPS无处不在!
我们的堆栈实际上是什么样的?从浏览器中运行的网站(在应用程序级别)的角度来看,我们必须遍历以下几层才能达到IP级别:
1.客户端浏览器、
2.HTTP、
3.SSL / TLS、
4.TCP协议、
5.知识产权
HTTPS就是SSL / TLS之上的HTTP协议。因此,所有HTTP规则仍然适用。这个额外的层实际上给了我们什么?有很多优点:我们通过拥有密钥和证书来进行身份验证;由于以非对称方式对连接进行加密,因此可以确保某种类型的隐私和机密性;并且还保留了数据完整性,因为传输的数据在传输过程中无法更改。
最普遍的神话之一是,使用SSL / TLS的计算量很大,并且会降低服务器的速度。这肯定不再是事实。我们也不需要带有加密单元的任何专用硬件。即使对于Google而言,SSL / TLS层也占不到CPU负载的1%,与HTTP相比,HTTPS的网络开销也低于2%。总而言之,为了节省一些开销,放弃HTTPS是没有意义的。
最新版本是TLS 1.3。TLS是SSL的后继产品,最新版本的SSL 3.0中提供了TLS。从SSL到TLS的更改排除了互操作性,但是基本过程保持不变。我们有三个不同的加密通道。第一个是用于证书链的公钥基础结构。第二种提供用于密钥交换的公共密钥加密。最后,第三个是对称的。在这里,我们有用于数据传输的密码学。
TLS 1.3对某些重要操作使用哈希处理。从理论上讲,可以使用任何哈希算法,但是强烈建议使用SHA2或更强大的算法。SHA1长期以来一直是标准,但最近已过时。
HTTPS也越来越受到客户的关注。隐私和安全问题一直存在,但是随着在线可访问数据和服务数量的增长,人们越来越关注。对于那些未实现此功能的网站,有一个有用的浏览器扩展-EFF的HTTPS Everywhere-可加密我们与大多数网站的通信。
创建者意识到许多网站仅部分提供HTTPS。该插件使我们可以重写仅提供部分HTTPS支持的网站的请求。另外,我们也可以完全阻止HTTP(请参见上面的屏幕截图)。
二、基本说明
证书的验证过程包括验证证书签名和有效期。我们还需要验证它是否链接到受信任的根。最后,我们需要检查它是否已被撤销。世界上有专门的可信赖的机构来颁发证书。如果其中之一遭到破坏,则来自该机构的所有其他证书将被吊销。
HTTPS握手的序列图如下所示。我们从客户端初始化开始,然后是带有证书和密钥交换的消息。服务器发送完成的包后,客户端可以开始密钥交换和密码规范传输。至此,客户端结束。最后,服务器确认密码规范选择并关闭握手。