> 文章列表 > 前端视角-https总结

前端视角-https总结

前端视角-https总结

1.http存在的问题

1.1可能被窃听

  • HTTP 本身不具备加密的功能,HTTP 报文使用明文方式发送
  • 互联网是由联通世界各个地方的网络设施组成,所有发送和接收经过某些设备的数据都可能被截获或窥视。(例如TCP/IP抓包工具:Wireshark),即使经过加密处理,也会被窥视是通信内容,只是可能很难或者无法破解出报文的信息而已

1.2 认证问题

  • 无法确认你发送到的服务器就是真正的目标服务器(可能服务器是伪装的)
  • 无法确定返回的客户端是否是按照真实意图接收的客户端(可能是伪装的客户端)
  • 无法确定正在通信的对方是否具备访问权限,Web 服务器上某些重要的信息,只想发给特定用户即使是无意义的请求也会照单全收。无法阻止海量请求下的 DoS 攻击(Denial of Service,拒绝服务攻击)。

1.3可能被篡改

请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击被称为中间人攻击(Man-in-the-Middle attack,MITM

2.https的ssl协议

HTTPS 协议的主要功能基本都依赖于 SSL 协议,SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。

前端视角-https总结

2.1对称加密

  • 常见的有 AES-CBC、DES、3DES、AES-GCM等,相同的密钥可以用于信息的加密和解密,掌握密钥才能获取信息,能够防止信息窃听,通信方式是1对1;
  • 对称加密需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和多 个客户端通信,需要维持多个密码记录,且缺少修改密码的机制;
  • 优点:算法公开、计算量小、加密速度快、加密效率高。
  • 缺点:交易双方都使用同样钥匙,安全性得不到保证。

2.2非对称加密

  • 即常见的 RSA 算法,还包括 ECC、DH 等算法,算法特点是,密钥成对出现,一般称为公钥(公开)和私钥(保密),公钥加密的信息只能私钥解开,私钥加密的信息只能公钥解开。因此掌握公钥的不同客户端之间不能互相解密信息,只能和掌握私钥的服务器进行加密通信,服务器可以实现1对多的通信,客户端也可以用来验证掌握私钥的服务器身份。
  • 非对称加密的特点是信息传输一对多,服务器只需要维持一个私钥就能够和多个客户端进行加密通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密速度慢。

2.3完整性验证算法

  • 常见的有 MD5、SHA1、SHA256,该类函数特点是函数单向不可逆、对输入非常敏感、输出长度固定,针对数据的任何修改都会改变散列函数的结果,用于防止信息篡改并验证数据的完整性;
  • 在信息传输过程中,散列函数不能单独实现信息防篡改,因为明文传输,中间人可以修改信息之后重新计算信息摘要,因此需要对传输的信息以及信息摘要进行加密;

2.4工作方式

  • 客户端使用非对称加密与服务器进行通信,实现身份验证并协商对称加密使用的密钥
  • 然后对称加密算法采用协商密钥对信息以及信息摘要进行加密通信,不同的节点之间采用的对称密钥不同,从而可以保证信息只能通信双方获取。

2.5SSL协议构成

SSl = 记录协议(Record Protocol) + 握手协议(Handshake Protocol)

记录协议(Record Protocol): 用于定义传输格式
握手协议(Handshake Protocol): 它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
前端视角-https总结

2.6 申请和发放证书流程如下

证书的作用就是,我和服务端通信,我怎么知道这个服务端是我要真正通信的服务端呢

前端视角-https总结

  • 服务方 Server 向第三方机构CA提交公钥、组织信息、个人信息(域名)等信息并申请认证;
  • CA通过线上、线下等多种手段验证申请者提供信息的真实性,如组织是否存在、企业是否合法,是否拥有域名的所有权等;
  • 如信息审核通过,CA会向申请者签发认证文件-证书。证书包含以下信息:申请者公钥、申请者的组织信息和个人信息、签发机构 CA的信息、有效时间、证书序列号等信息的明文,同时包含一个签名; 签名的产生算法:首先,使用散列函数计算公开的明文信息的信息摘要,然后,采用 CA的私钥对信息摘要进行加密,密文即签名;
  • 客户端 Client 向服务器 Server 发出请求时,Server 返回证书文件;
  • 客户端 Client 读取证书中的相关的明文信息,采用相同的散列函数计算得到信息摘要,然后,利用对应 CA的公钥解密签名数据,对比证书的信息摘要,如果一致,则可以确认证书的合法性,即公钥合法;
  • 客户端还会验证证书相关的域名信息、有效时间等信息; 客户端会内置信任CA的证书信息(包含公钥),如果CA不被信任,则找不到对应 CA的证书,证书也会被判定非法。

3.https服务器

  • HTTPS使用https协议,默认端口号443;
  • HTTPS需要向证书授证中心申请证书;
  • HTTPS服务器与客户端之间传输是经过SSL安全加密后的密文数据; 在创建HTTPS服务器之前,服务器首先需要创建公钥、私钥及证书,步骤如下 创建公钥、私钥及证书

3.1 创建私钥

openssl genrsa -out privatekey.pem 1024

3.2 创建证书签名请求

openssl req -new -key privatekey.pem -out certrequest.csr

3.3 获取证书,线上证书需要经过证书授证中心签名的文件;下面只创建一个学习使用证书

openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem

3.4 创建pfx文件

openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out certificate.pfx

3.5 创建服务器

创建HTTPS服务器同HTTP服务器大致相同,需要增加证书,创建HTTPS服务器时通过options参数设置。

https.createServer(options,[requestListener]);
  • pfx 私钥、公钥以及证书
  • key 私钥
  • passphrase 为私钥指定密码
  • cert 公钥
  • ca 证书,用于指定一组证书,默认属性值为几个著名的证书授权中心,例如VerlSign
  • crl 指定证书吊销主
import https from 'https';
import fs from 'fs';var pk = fs.readFileSync('privatekey.pem'),pc = fs.readFileSync('certificate.pem');var opts = {key: pk,cert: pc
};var server = https.createServer(opts);

opts参数为一个对象,用于指定创建HTTPS服务器时配置的各种选项,下面只描述几个必要选项:

属性名 说明
pff 用于指定从pfx文件读取出的私钥、公钥以及证书(指定该属性后,无需再指定key、cert、ca)
key 用于指定后缀名为pem的文件,读出私钥
cert 用于指定后缀名为pem的文件,读出公钥
ca 用于指定一组证书,默认值为几个著名的证书授证中心

3.6 创建HTTPS客户端

在https模块中,可以使用request方法向其它使用HTTPS协议的网站请求数据

let req = https.request(options,callback);
  • host 指定域名或目标主机的IP地址
  • hostname 指定域名或目标主机的IP地址
  • port 端口号
  • method 指定请求方法名
  • path 指下请求路径及查询字符串
  • headers 客户端请求头对象
  • auth 指定认证信息部分
  • agent 指定用户代理,指定false则从连接池中挑选一个连接状态为关闭的https.Agent对象
  • pfx 指定私钥、公钥和证书
  • key 指定私钥
  • cert 公钥
  • ca 一组证书
const options = {hostname: 'localhost',port: 1443,path: '/',method: 'post',key: fs.readFileSync('privatekey.pem'),cert: fs.readFileSync('certificate.pem'),rejectUnhauthorized: false,agent: false // 从连接池中指定挑选一个当前连接状态为关闭的https.Agent},req = https.request(options);// 或者
const options = {hostname: 'localhost',port: 1443,path: '/',method: 'post',key: fs.readFileSync('privatekey.pem'),cert: fs.readFileSync('certificate.pem'),rejectUnhauthorized: false,};
// 显示指定https.Agent对象
options.agent = new https.Agent(options);
var req = https.request(options);

3.8 让你的网站支持https

实战申请Let’s Encrypt永久免费SSL证书过程教程及常见问题

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
chmod 777 ./letsencrypt-auto
./letsencrypt-auto certonly --standalone --email zhang_renyang@126.com -d itnewhand.com/etc/letsencrypt/live/itnewhand.com/fullchain.pem
/etc/letsencrypt/live/itnewhand.com/privkey.pem