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 服务器