调研背景

公司项目打算采用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 进行通信。

https

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进行查看单管网站所用的版本;

tlsVersion

证书颁发机构(CA)

  • 证书颁发机构(Certificate Authority,CA)是一种受信任的第三方实体,它负责验证数字证书中的信息,并将其绑定到公钥上,从而帮助确保证书的真实性和完整性。

  • 数字证书是一种用于加密通信和保护数据完整性的安全证书。数字证书包含一个公钥和与该公钥相关联的信息,例如证书的所有者和有效期。当客户端连接到一个使用SSL/TLS协议保护的服务时,服务器会向客户端发送一个数字证书,以证明自己的身份和服务器的公钥。

  • 在数字证书中,公钥由证书颁发机构签名,以验证证书中的信息的真实性和完整性。因此,证书颁发机构是数字证书中非常重要的一个组成部分,它为证书的真实性和完整性提供了保障。

  • 通过使用受信任的证书颁发机构签名的数字证书,客户端可以确信服务器的身份,从而可以信任与服务器之间的通信。在Web浏览器中,浏览器会预装一组受信任的证书颁发机构,以验证访问的网站的证书是否有效。如果证书不是由受信任的证书颁发机构签发的,浏览器就会发出警告,提示用户访问的网站可能不安全。

mkcert

mkcert 是一个用于制作本地可信任开发证书的简单工具,不需要配置。

使用来自真实证书颁发机构 (CA) 的证书进行开发可能是危险的或不可能的(对于主机,如example.test,localhost127.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进行开发。

  1. mkcert下载:下载链接

mkcert_step1

  1. 生成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

mkcert_step2

  1. 安装成功,提示创建一个新的本地CA,本地CA现在已安装在系统信任存储中。

mkcert_step3

  1. 测试mkcert是否安装成功

mkcert_step4

  1. 查看CA证书存放位置

输入mkcert-v1.4.4-windows-amd64.exe -CAROOT命令

mkcert_step5

mkcert_step5_1

按“Windows键+R”调出运行框,输入certmgr.msc命令。打开证书控制台。

mkcert_step5_2

  1. 生成自签证书,可供局域网内使用其他主机访问。
  • 直接跟多个要签发的域名或 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_step6

在mkcert软件同目录下,生成了自签证书。如图所示。

上述命令会自动使用第2步创建的CA生成证书文件,其中xxx.pem为证书,xxx-key.pem为私钥。生成了证书和私钥以后,就可以在web服务器开启https了。

mkcert_step6_1

  1. 通过nginx搭建web服务器并开启https
1
2
3
4
//nginx常用命令
start nginx 开启
nginx -s stop 停止
nginx -s reload 重新加载

修改nginx.conf文件中的证书和私钥的路径,别的暂时不做修改。mkcert_step7

进入nginx文件夹,开启nginx

mkcert_step7_1

  1. 访问搭建的服务

通过步骤6配置的IP进行访问,这里经测试,目前127.0.0.1:443和fsllala.philisense.com:443目前不能访问。

mkcert_step8

将vue项目通过npm run build进行打包,然后将dist文件下中的打包文件放到nginx的html目录中

mkcert_step8_1

再次通过步骤6配置的IP进行访问

注:这里可能会遇到Invalid Host header的错误,解决方法

mkcert_step8_2

这里可以看到警告,意思大概为:请求并未升级到https,因为访问地址是ip地址,应该采用域名进行https访问。

  1. 本地开发指定 Host

因为网上没有特定的概念词语,因此我这边总结的标题是本地开发指定 Host,但其实简单点就是:localhost -> devlopment.com

通过win+R,然后输入C:\Windows\System32\drivers\etc,可以找到hosts文件

mkcert_step9

然后将步骤6中的域名与本地ip进行映射

mkcert_step9_1

稍等片刻,然后进行域名访问(这里不能挂代理,不然会访问不了),可以看到,没有上面IP的提示了。

mkcert_step9_2

  1. 此时用局域网的另一台电脑进行访问,通过https://192.168.11.242/#/可以进行访问,通过https://fsllala.philisense.com/#/不能进行访问。

可以看到另一台电脑上显示此证书是不安全的,因为我们用的证书是自签的,而不是公认的CA。我们需要将第2步产生的CA:

rootCA-key.pemrootCA.pem,将 rootCA.pem 复制到 另一台PC 上,并将其后缀改为 .crt

rootCA

双击 rootCA.crt,根据提示安装证书,步骤如下:

rootCA_install

重启浏览器再次访问,可以看到连接已经变为安全。

  1. 另一台机器使用域名进行访问

同搭建环境的机器一样,在另一台机器上,也需要本地开发指定 Host,即:192.168.11.242 fsllala.philisense.com,然后稍等片刻,即可进行访问。(步骤10解决了HTTPS不信任的问题)

  1. 接口全部不能通信

因为HTTP和HTTPS是两个不同的协议,所以两者不能进行通信。项目虽然是HTTPS了,但是接口都噶了,肯定是不行的,所以需要通过nginx进行接口的代理,将原来的HTTP接口,反向代理成HTTPS接口。

mkcert_step12

  1. 反向代理 接口HTTP为HTTPS,WS为WSS

因为项目用到了HTTP和WS,所以都需要进行代理:以下代码意思为:接口中带有/fsl/的都会走http://192.168.13.102:9003/代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
server {
listen 443 ssl;
server_name localhost;

# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
#证书
ssl_certificate /mkcert2/127.0.0.1+2.pem;
#私钥
ssl_certificate_key /mkcert2/127.0.0.1+2-key.pem;

ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;

ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;


location /fsl/ {
# root html;
# index index.html index.htm;
proxy_pass http://192.168.13.102:9003/; #现接口地址

# websocket
# proxy_pass http://192.168.13.102:9003/; #websocket服务器
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}

location / {
root html;
index index.html index.htm;
}
}

mkcert_step13

然后将vue项目中的接口服务地址和协议进行修改,如下图所示:

需要修改IP,https/wss、端口号、进行nginx代理的关键字(/fsl/)

mkcert_step13_1

然后将vue进行打包,放到nginx下的html目录下;nginx通过nginx -s reload进行重新加载。

  1. 通过上述映射的域名(https://fsllala.philisense.com)进行访问

可能会出现一些图片/标乱码的情况,关闭浏览器,重新打开即可。

mkcert_step14

mkcert_step14_1

可以看到,此时接口(http、ws)均进行了代理,可以进行正常的访问。

总结

  • 虽然可以将 SSL/TLS 证书与 IP 地址绑定,但出于安全和兼容性考虑,建议尽可能使用域名来保护您的应用程序;
  • 使用mkcert可以进行内网的https,但是局域网内的另一台PC,会显示此https不安全,需要安装CA根证书解决不安全的问题;
  • 局域网的另一台PC,同搭建环境PC一样,不能直接通过映射的域名进行访问,需要修改host进行域名映射。

外网HTTPS

外网免费HTTPS是不能绑定IP的,无论是上面提及的Let’s Encrypt,还是腾讯云,阿里云等。

腾讯云

免费SSL

tencentSSL

阿里云

免费SSL

aliSSL

相关文献