请求或响应在传输途中,遭攻击者拦截并篡改内容的攻击被称为中间人攻击(Man-in-the-Middle attack,MITM)
HTTPS 协议的主要功能基本都依赖于 SSL 协议,SSL 的功能实现主要依赖于三类基本算法:散列函数 、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
SSl = 记录协议(Record Protocol) + 握手协议(Handshake Protocol)
记录协议(Record Protocol): 用于定义传输格式
握手协议(Handshake Protocol): 它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等
证书的作用就是,我和服务端通信,我怎么知道这个服务端是我要真正通信的服务端呢
openssl genrsa -out privatekey.pem 1024
openssl req -new -key privatekey.pem -out certrequest.csr
openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out certificate.pfx
创建HTTPS服务器同HTTP服务器大致相同,需要增加证书,创建HTTPS服务器时通过options参数设置。
https.createServer(options,[requestListener]);
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 | 用于指定一组证书,默认值为几个著名的证书授证中心 |
在https模块中,可以使用request方法向其它使用HTTPS协议的网站请求数据
let req = https.request(options,callback);
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);
实战申请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