https
调研背景
公司项目打算采用 HTTPS 来保证数据的安全性。在计划零成本的前提下,看是否可以实现 HTTPS。
HTTP 与 HTTPS 区别
- 数据加密:HTTPS 使用 SSL/TLS 协议对传输数据进行加密,使得第三方无法窃取数据内容。HTTP 传输的数据是明文,容易被黑客窃取和篡改。
- 数据完整性:在数据传输过程中,HTTPS 使用消息认证码(MAC)校验数据完整性,如果数据被篡改或者损坏,在传输过程中会被损坏。
- 身份验证:HTTPS 使用证书机制来验证网络通信的双方身份,加强了验证的强度和客户端和服务器之间的信任。HTTP 没有身份验证机制,容易遭受中间人攻击。
HTTPS 并不是一种新的协议,我们可以理解为 HTTPS 协议 = HTTP 协议 + SSL/TLS 协议。通常来说,HTTP 是直接和 TCP 进行通信的。当我们使用 SSL/TLS 时,会变成先和 SSL/TLS 通信,然后再由 SSL/TLS 和 TCP 进行通信。
SSL/TLS
SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)都是网络通信中的加密协议,它们的主要目的是在网络通信中保护传输数据的机密性和完整性。SSL 是 TLS 的前身,TLS 是 SSL 的升级版,这两者之间的区别如下:
- 名称: SSL 是早期加密协议的名称,后来被 TLS 所取代。目前常用的是 TLS 协议。
- 历史:SSL 协议是在 1995 年由 Netscape 开发的。随着时间的推移,SSL 逐渐被其他安全协议所取代。TLS 是 SSL 的继任者,旨在改进 SSL 协议中的一些安全问题。TLS 协议于 1999 年发布,TLS 1.0 成为 Internet 工程任务组(IETF)的正式标准。
- 版本:SSL 协议共有三个版本,分别为 SSL 1.0、SSL 2.0 和 SSL 3.0,但是 SSL 2.0 存在一些安全性问题,并且被证明不可靠,已经不再使用。TLS 协议目前有四个版本,分别为 TLS 1.0、TLS 1.1、TLS 1.2 和 TLS 1.3。
- 安全性:TLS 协议比 SSL 协议更加安全,因为 TLS 协议改进了一些 SSL 协议中的安全问题。例如,TLS 协议使用更强的加密算法,可以保护数据传输的安全性,并防止中间人攻击。TLS 1.3 版本还可以提高握手过程的效率,并提供更好的安全保障。
- 应用:SSL 和 TLS 协议都可以用于加密 HTTP 请求,从而保护用户数据的安全性。HTTPS(HTTP over SSL/TLS)是使用 SSL 或 TLS 协议加密的 HTTP 请求。
总之,SSL 和 TLS 协议都是用于在网络上保护数据传输的安全性的加密协议。虽然 SSL 协议已经不再使用,但 TLS 协议已经取代了 SSL 协议,并成为了现代互联网上加密通信的标准。
注:可以 F12,选择 Security 进行查看单管网站所用的版本;
证书颁发机构(CA)
证书颁发机构(Certificate Authority,CA)是一种受信任的第三方实体,它负责验证数字证书中的信息,并将其绑定到公钥上,从而帮助确保证书的真实性和完整性。
数字证书是一种用于加密通信和保护数据完整性的安全证书。数字证书包含一个公钥和与该公钥相关联的信息,例如证书的所有者和有效期。当客户端连接到一个使用 SSL/TLS 协议保护的服务时,服务器会向客户端发送一个数字证书,以证明自己的身份和服务器的公钥。
在数字证书中,公钥由证书颁发机构签名,以验证证书中的信息的真实性和完整性。因此,证书颁发机构是数字证书中非常重要的一个组成部分,它为证书的真实性和完整性提供了保障。
通过使用受信任的证书颁发机构签名的数字证书,客户端可以确信服务器的身份,从而可以信任与服务器之间的通信。在 Web 浏览器中,浏览器会预装一组受信任的证书颁发机构,以验证访问的网站的证书是否有效。如果证书不是由受信任的证书颁发机构签发的,浏览器就会发出警告,提示用户访问的网站可能不安全。
mkcert
mkcert 是一个用于制作本地可信任开发证书的简单工具,不需要配置。
使用来自真实证书颁发机构 (CA) 的证书进行开发可能是危险的或不可能的(对于主机,如
example.test
,localhost
或127.0.0.1
),但自签名证书会导致信任错误。mkcert 自动在系统根存储中创建并安装本地 CA,并生成本地信任的证书。
Let’s Encrypt
- Let’s Encrypt 是国外一个公共的免费 SSL 项目,由 Linux 基金会托管,由 Mozilla、思科、Akamai、IdenTrust 和 EFF 等组织发起,靠谱!
- Let’s Encrypt 安装部署简单、方便,目前 Cpanel、Oneinstack 等面板都已经集成了 Let’s Encrypt 一键申请安装,简单!
- Let’s Encrypt 证书有效期三个月 ,每三个月需要续签证书 see why
- Let’s Encrypt 注册主域名认证频率 20 个 / 周,同一域名重复认证 5 次 / 周 see more
- Let’s Encrypt 不支持绑定 IP,只能绑定域名,域名需可以在公共 Internet 上被访问到
mkcert 与 Let’s Encrypt 区别
- 认证机构:Let’s Encrypt 是一个公共的免费认证机构,可以为任何人免费签发 SSL 证书。与之相反,mkcert 是一个自签名证书工具,它创建的证书只能用于开发和测试目的。
- 证书的有效期:Let’s Encrypt 签发的证书的有效期为 90 天。在证书即将过期时,您可以自动更新证书。相反,mkcert 默认情况下签发的证书有效期为 2 年,需要手动更新证书。
- 使用场景:Let’s Encrypt 适用于需要为公共访问的网站签发证书的情况,例如在线商店、社交媒体等。而 mkcert 适用于开发和测试环境中使用,例如本地开发机器、测试环境等。
- 验证方式:Let’s Encrypt 使用 ACME 协议来验证证书请求者的身份。ACME 是一种自动化的验证协议,需要您在域名系统中创建一个特殊的 DNS 记录或在您的 Web 服务器上放置一个特殊的文件。ACME 协议将验证这些信息,以确定您对域名或服务器的控制权;相反,mkcert 使用本地证书颁发机构(CA)来签署证书,因此只能用于本地开发环境和测试环境。当您安装 mkcert 时,它将在您的计算机上创建一个本地 CA,并将其添加到操作系统的信任列表中。这使得 mkcert 能够签署您本地环境中的 SSL 证书,而无需进行任何验证。
- 配置和使用:使用 Let’s Encrypt 需要您安装 ACME 客户端,并将其配置为与您的 Web 服务器配合使用。您还需要将域名解析为您的 Web 服务器,并公开暴露您的服务器以接受来自 Let’s Encrypt 的验证请求。相反,使用 mkcert 只需要在您的计算机上安装它,并使用它来生成证书。由于 mkcert 是自签名的,您无需将域名解析为 Web 服务器或公开暴露 Web 服务器以进行验证。您可以使用 mkcert 在本地生成 SSL 证书,并将其用于开发和测试目的。
- 安全性:Let’s Encrypt 签发的证书使用公共密钥加密技术,可以提供与任何其他公共 CA 颁发的证书相同的安全保障。它还提供了 TLSA 记录,可防止 DNS 中间人攻击。由于 mkcert 是自签名的,因此不能提供与公共 CA 颁发的证书相同的安全保障。它仅适用于开发和测试环境,并不适合用于公共网站。但是,在本地环境中使用 mkcert 仍然比在未加密的 HTTP 连接上运行应用程序要更安全。
总结:如果您需要在公共网站上使用 SSL 证书,建议使用 Let’s Encrypt,因为 Let’s Encrypt 是一个针对公共网站的免费证书颁发机构。而如果您只是在开发和测试环境中使用 SSL 证书,则建议使用 mkcert,因为 mkcert 则是一个针对本地开发和测试环境的工具,用于快速创建自签名的 SSL 证书。
关于 IP 绑定
Let’s Encrypt
Let’s Encrypt 不支持绑定 IP 地址,它只能绑定域名。Let’s Encrypt 是一个免费的公共 SSL 证书颁发机构,它的证书是基于域名颁发的。在颁发证书时,Let’s Encrypt 需要验证域名的所有权和控制权,而不能验证 IP 地址的所有权和控制权。因此,如果您想使用 Let’s Encrypt 证书保护您的网站,您必须使用域名来访问您的网站,而不能使用 IP 地址。如果您的网站必须使用 IP 地址来访问,您可以考虑使用其他证书颁发机构颁发的证书,这些机构可能支持使用 IP 地址来验证证书的所有权和控制权。
mkcert
mkcert 不支持直接绑定 IP 地址,因为 SSL/TLS 证书的设计是基于域名而非 IP 地址的。然而,您可以通过使用一个本地的域名解析器,例如
dnsmasq
,来将您的 IP 地址映射到一个本地的域名上。这样,您可以在本地使用这个域名来访问您的服务,然后使用 mkcert 来为这个域名生成 SSL/TLS 证书。生成的证书将会包含这个本地的域名,而不是您的 IP 地址。请注意,这种方法只适用于本地开发和测试,因为这个本地的域名不能被公共的 DNS 服务器解析。如果您需要在公共网络上使用 SSL/TLS 证书来保护您的服务,您必须使用一个真实的域名,并将它绑定到您的 IP 地址上。
开发环境
win11,node(v16.18.0)、 nginx/Windows-1.24.0
内网 HTTPS (free)
综上所述,内网 HTTPS 采用 mkcert 进行开发。
- mkcert 下载:下载链接
- 生成 CA(certificate authority,即证书颁发机构):输入 cmd,初次安装 mkcert
输入 mkcert-v1.4.4-windows-amd64 -install
命令 ,安装 mkcert。将 CA 证书加入本地可信 CA,使用此命令,就能帮助我们将 mkcert 使用的根证书加入了本地可信 CA 中,以后由该 CA 签发的证书在本地都是可信的。卸载命令 mkcert-v1.4.4-windows-amd64 -uninstall
- 安装成功,提示创建一个新的本地 CA,本地 CA 现在已安装在系统信任存储中。
- 测试 mkcert 是否安装成功
- 查看 CA 证书存放位置
输入 mkcert-v1.4.4-windows-amd64.exe -CAROOT
命令
按 “Windows 键 + R” 调出运行框,输入 certmgr.msc 命令。打开证书控制台。
- 生成自签证书,可供局域网内使用其他主机访问。
直接跟多个要签发的域名或 ip 就行了,比如签发一个仅本机访问的证书 (可以通过 127.0.0.1 和 localhost,以及 ipv6 地址::1 访问)
需要在局域网内测试 https 应用,这种环境可能不对外,因此也无法使用像 Let’s encrypt 这种免费证书的方案给局域网签发一个可信的证书,而且 Let’s encrypt 本身也不支持认证 Ip。
证书可信的三个要素:
- 由可信的 CA 机构签发;
- 访问的地址跟证书认证地址相符;
- 证书在有效期内;
如果期望自签证书在局域网内使用,以上三个条件都需要满足。很明显自签证书一定可以满足证书在有效期内,那么需要保证前两条。我们签发的证书必须匹配浏览器的地址栏,比如局域网的 ip 或者域名,此外还需要信任 CA。操作如下:
创建自签名证书,例如要为域名:
fsllala.philisense.com
(随便输入的域名) 和 IP:127.0.0.1
、192.168.11.242
(本机 IP) 创建证书,可以使用如下的命令
1 | mkcert-v1.4.4-windows-amd64.exe 127.0.0.1 192.168.11.242 fsllala.philisense.com |
在 mkcert 软件同目录下,生成了自签证书。如图所示。
上述命令会自动使用第 2 步创建的 CA 生成证书文件,其中
xxx.pem
为证书,xxx-key.pem
为私钥。生成了证书和私钥以后,就可以在 web 服务器开启 https 了。
- 通过 nginx 搭建 web 服务器并开启 https
1 | //nginx常用命令 |
修改 nginx.conf 文件中的证书和私钥的路径,别的暂时不做修改。
进入 nginx 文件夹,开启 nginx
- 访问搭建的服务
通过步骤 6 配置的 IP 进行访问,这里经测试,目前 127.0.0.1:443 和 fsllala.philisense.com:443 目前不能访问。
将 vue 项目通过 npm run build
进行打包,然后将 dist 文件下中的打包文件放到 nginx 的 html 目录中
再次通过步骤 6 配置的 IP 进行访问
注:这里可能会遇到 Invalid Host header
的错误,解决方法
这里可以看到警告,意思大概为:请求并未升级到 https,因为访问地址是 ip 地址,应该采用域名进行 https 访问。
- 本地开发指定 Host
因为网上没有特定的概念词语,因此我这边总结的标题是本地开发指定 Host,但其实简单点就是:localhost -> devlopment.com
。
通过 win+R,然后输入 C:\Windows\System32\drivers\etc
,可以找到 hosts 文件
然后将步骤 6 中的域名与本地 ip 进行映射
稍等片刻,然后进行域名访问 (这里不能挂代理,不然会访问不了),可以看到,没有上面 IP 的提示了。
- 此时用局域网的另一台电脑进行访问,通过
https://192.168.11.242/#/
可以进行访问,通过https://fsllala.philisense.com/#/
不能进行访问。
可以看到另一台电脑上显示此证书是不安全的,因为我们用的证书是自签的,而不是公认的 CA。我们需要将第 2 步产生的 CA:
rootCA-key.pem
和 rootCA.pem
,将 rootCA.pem
复制到 另一台 PC 上,并将其后缀改为 .crt
。
双击 rootCA.crt
,根据提示安装证书,步骤如下:
重启浏览器再次访问,可以看到连接已经变为安全。
- 另一台机器使用域名进行访问
同搭建环境的机器一样,在另一台机器上,也需要本地开发指定 Host,即:192.168.11.242 fsllala.philisense.com
,然后稍等片刻,即可进行访问。(步骤 10 解决了 HTTPS 不信任的问题)
- 接口全部不能通信
因为 HTTP 和 HTTPS 是两个不同的协议,所以两者不能进行通信。项目虽然是 HTTPS 了,但是接口都噶了,肯定是不行的,所以需要通过 nginx 进行接口的代理,将原来的 HTTP 接口,反向代理成 HTTPS 接口。
- 反向代理 接口 HTTP 为 HTTPS,WS 为 WSS
因为项目用到了 HTTP 和 WS,所以都需要进行代理:以下代码意思为:接口中带有 /fsl/
的都会走 http://192.168.13.102:9003/
代理
1 | server { |
然后将 vue 项目中的接口服务地址和协议进行修改,如下图所示:
需要修改 IP,https/wss、端口号、进行 nginx 代理的关键字 (/fsl/)
然后将 vue 进行打包,放到 nginx 下的 html 目录下;nginx 通过 nginx -s reload
进行重新加载。
- 通过上述映射的域名 (https://fsllala.philisense.com) 进行访问
可能会出现一些图片 / 标乱码的情况,关闭浏览器,重新打开即可。
可以看到,此时接口 (http、ws) 均进行了代理,可以进行正常的访问。
总结
- 虽然可以将 SSL/TLS 证书与 IP 地址绑定,但出于安全和兼容性考虑,建议尽可能使用域名来保护您的应用程序;
- 使用 mkcert 可以进行内网的 https,但是局域网内的另一台 PC,会显示此 https 不安全,需要安装 CA 根证书解决不安全的问题;
- 局域网的另一台 PC,同搭建环境 PC 一样,不能直接通过映射的域名进行访问,需要修改 host 进行域名映射。
外网 HTTPS
外网免费 HTTPS 是不能绑定 IP 的,无论是上面提及的 Let’s Encrypt,还是腾讯云,阿里云等。
腾讯云
阿里云
相关文献
- 为什么 HTTPS 比 HTTP 更安全?HTTPS 如何保证数据传输安全性
- HTTPS 为什么是安全的
- 前端本地开发指定域名以及 HTTPS 配置方案
- mkcert 使用指南:如何快速创建自签名 SSL 证书
- 使用 mkcert 工具生成受信任的 SSL 证书,解决局域网本地 https 访问问题
- windows 使用 mkcert 配置本地 https 环境
- 本地 https 环境解决方案
- 使用 mkcert 创建自签名证书
- 解决 Invalid Host header 问题
- mkcert + nginx 搭建 https
- window 使用 mkcert,nginx 的配置 https 证书
- Linux 运维实战:Nginx 方向代理 wss 或 ws
- Host 相关
- Let’s Encrypt 实践指北
- 免费 SSL 证书 之 Let’s Encrypt 申请与部署 (Windows Nginx)
- windows 环境免费申请 SSL 证书
- windows 使用 Certbot 配置 nginx 的 https 证书
- 如何使用 Nginx 和 Certbot 创建一个安全的 Web 服务器