参考文章

在上一篇博文《Node核心模块之crypto》中,提到了加密(摘要,加密解密,签名等)的四种常见类型:

  • Hash(哈希)
  • HMAC(基于哈希的消息认证码)
  • 加密,解密
  • 签名,验证

HTTPS的整个过程和以上几种方法密切相关。

CA证书

CA 即 Certificate Authority (数字证书认证机构),CA证书的签发以及验证包含以下三方:

  • CA
  • Server
  • Client

过程包括:

  1. Server生成一对公钥和私钥
  2. Server将公钥以及域名等信息提交给CA
  3. CA对Server提交的信息进行审核,如果审核通过,则使用CA的私钥对Server所提交的信息进行签名
  4. Client向Server发起请求时,Server返回证书
  5. Client使用CA的公钥对证书进行验证
  6. 如果验证通过,则Client认为Server可信,进行后续通话

HTTPS流程概述

下面是HTTPS流程的简要概述:

HTTPS

图片来源:http://www.cnblogs.com/ttltry-air/archive/2012/08/20/2647898.html

  1. Client发起HTTPS连接请求,Server返回证书
  2. Client生成随机数
  3. Client使用证书中的公钥加密随机数
  4. Client将加密后的随机数发给Server,Server使用私钥进行解密得到随机数
  5. 使用该随机数作为对称加密密钥进行后续通话

当然,这只是一个非常简要的概述,而实际上协商对称加密密钥等过程要复杂的多,可以通过参考文章查看更加详细的过程。

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就可以了。