HTTPS小结
原文链接 https://syaning.github.io/2016/10/17/https/
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
参考文章
在上一篇博文《Node核心模块之crypto》中,提到了加密(摘要,加密解密,签名等)的四种常见类型:
- Hash(哈希)
- HMAC(基于哈希的消息认证码)
- 加密,解密
- 签名,验证
HTTPS的整个过程和以上几种方法密切相关。
CA证书
CA 即 Certificate Authority (数字证书认证机构),CA证书的签发以及验证包含以下三方:
- CA
- Server
- Client
过程包括:
- Server生成一对公钥和私钥
- Server将公钥以及域名等信息提交给CA
- CA对Server提交的信息进行审核,如果审核通过,则使用CA的私钥对Server所提交的信息进行签名
- Client向Server发起请求时,Server返回证书
- Client使用CA的公钥对证书进行验证
- 如果验证通过,则Client认为Server可信,进行后续通话
HTTPS流程概述
下面是HTTPS流程的简要概述:
图片来源:http://www.cnblogs.com/ttltry-air/archive/2012/08/20/2647898.html
- Client发起HTTPS连接请求,Server返回证书
- Client生成随机数
- Client使用证书中的公钥加密随机数
- Client将加密后的随机数发给Server,Server使用私钥进行解密得到随机数
- 使用该随机数作为对称加密密钥进行后续通话
当然,这只是一个非常简要的概述,而实际上协商对称加密密钥等过程要复杂的多,可以通过参考文章查看更加详细的过程。
Node.js HTTPS
下面是用Node创建一个HTTPS服务器的例子。
# 生成私钥 server.key
openssl genrsa -out server.key 2048
# 生成请求文件 server.csr
openssl req -new -key server.key -out server.csr
# 自签名,生成证书 server.crt
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
const fs = require('fs')
const https = require('https')
const express = require('express')
const app = express()
const options = {
key: fs.readFileSync('server.key'),
cert: fs.readFileSync('server.crt')
}
app.get('/', (req, res) => {
res.send('hello world')
})
https.createServer(options, app)
.listen(9000, () => console.log('server on port 9000 ...'))
然后访问https://localhost:9000
就可以了。