资讯专栏INFORMATION COLUMN

Node.js学习之路13——HTTP与HTTPS

lei___ / 2662人阅读

摘要:和的区别服务器使用协议服务器使用协议服务器需要向证书授权中心申请证书一般免费证书何绍需要交费在少许读客户端有要求的情况下也会要求客户端使用证书服务器于客户端之间传输的是明文数据而服务器于客户端之间传输的是经过安全加密后的密文数据服务器通常使

4. HTTPHTTPS的区别

HTTPS服务器使用HTTPS协议,HTTP服务器使用HTTP协议.

HTTPS服务器需要向证书授权(Certificate Authority)中心申请证书,一般免费证书何绍需要交费.在少许读客户端有要求的情况下,也会要求客户端使用证书.

HTTP服务器于客户端之间传输的是明文数据,而HTTPS服务器于客户端之间传输的是经过SSL安全加密后的密文数据.

HTTP服务器通常使用808080端口,HTTPS服务器使用443端口.

5. 创建HTTPS服务器 5.1 前提条件——准备公钥私钥和证书

创建HTTPS服务器之间,服务器端首先需要创建公钥,私钥及证书

创建公钥,可以使用openssl工具创建私钥openssl genrsa -out privatekey.pem 1024

创建证书签名请求(Certificate Signing Request)文件openssl req -new -key privatekey.pem -out certreques.csr

获取证书,证书应该是一个经过证书授权中心签名的文件,该证书文件内宝蓝了服务器端提供的公钥以及证书的颁发机构等信息openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem,x509代表该证书如何国际电信联盟制定的数字证书标准

在客户端与服务器端建立连接后,将首先确认证书的合法性,如果在服务器中使用学习或测试用证书,使用浏览器访问该服务器时,浏览器中将先显示一个警告信息,警告用户该证书不是一个经过证书授权中心签名的证书.
在具备了证书文件之后,可以使用该证书文件创建一个pfx文件,所谓的pfx文件,是指该文件内容必须符合公钥加密技术12号标准(Public Key Cryptography Standards #12, PKCS#12)为存储和传输用户或服务器私钥,公钥和证书而指定的格式.
+. 在openssl工具中,可以创建pfx文件openssl pkcs12 -export -in certificate.pem -inkey privatekey.pem -out certificate.pfx
在这些文件都具备了之后,可以使用HTTPS模块中的createServer方法创建一个HTTPS服务器HTTPS.createServer(options, [requestListener(request, response)])

5.2 开始创建HTTPS服务器

HTTPS.createServer(options)

options为一个对象,使用的属性及属性值如下所示

pfx: 属性值为一个字符串或一个Buffer对象,用于指定从pfx文件读取出的私钥,公钥及证书,使用该属性值不需要指定key属性值,cert属性值以及ca属性值.

key: 属性值为一个字符串或一个Buffer对象,用于指定从后缀名为pem的私钥文件中读取出来的私钥,该属性值为必须指定属性值,除非指定了pfx属性值

passphrase: 属性值为一个自飞船,用于为私钥文件或pfx文件指定密码

cert: 属性值为一个字符串或一个Buffer对象,用于指定从后缀名为pem的文件中读物出来的公钥,该属性值为必须指定属性值,除非指定了pfx属性值

ca: 属性值为一个字符串或一个Buffer对象数组,用于指定一组证书,默认属性值为几个著名的证书授权认证中心,比如VerlSign

crl: 属性值为一个字符串或一个Buffer对象数组,用于指定证书吊销列表

ciphers: 属性值为一个字符串值,用于描述需要使用或取消使用的密码.为了阻挡BEAST攻击,推荐奖ciphers属性与honorCipherOrder属性结合使用,以指定非CBC(Cipher-block chaining,密码分组链接)模式的密码优先级,默认属性值为AES128-GCM-SHA256: RC4: HIGH: !MD5: !aNULL: !EDH

handshakeTimeout: 属性值为一个整数,用于指定多少秒内如果没有完成客户端与服务器之间的握手,则放弃本次连接,默认属性值为120s.当在指定时间内没有完成握手时,将处罚HTTPS服务器的clientError事件.

honorCipherOrder: 属性值为一个布尔值,当属性值指定为true时,服务器将密码列表发送给客户端,有客户端选择密码,尽管该属性值默认为false,但是仍推荐奖该属性值设置为true,以阻止BEAST攻击

requestCert: 属性值为一个布尔值,当属性值指定为true时,服务器在确认连接时要求客户端提供证书,默认属性值为false

rejectUnauthorized:属性值为一个布尔值,如果属性值为true,那么服务器拒绝任何不能提供服务器端所要求的证书的客户端.只有当requestCert属性值指定为true时,该属性值才有效,默认属性值为false

NPNProtocols: 属性值为一个数组或一个Buffer对象,用于指定服务器端所需使用的NPN协议(这些协议应该按照其优先级排序).NPN(Next Protocol Negotiation)协议是一种用于指定服务器可以使用多种协议(包括HTTP,SPDY协议等)的协议

sessionIdContext: 属性值指定为true,那么默认属性值为一个MD5散列值,如果requestCert属性值指定为false,不提供默认属性值

5.3 创建https服务器

生成私钥key文件openssl genrsa 1024 > /root/https/private.pem

通过私钥文件生成CSR证书签名openssl req -new -key /root/https/private.pem -out csr.pem

通过私钥文件和CSR证书签名生成证书文件openssl x509 -req -days 365 -in csr.pem -signkey /root/https/private.pem -out /root/https/file.crt

app.js文件代码

let app = require("express")();
const fs = require("fs");
const http = require("http");
const https = require("https");
const privateKey  = fs.readFileSync("/root/https/private.pem", "utf8");
const certificate = fs.readFileSync("/root/https/file.crt", "utf8");
const credentials = {key: privateKey, cert: certificate};

const httpServer = http.createServer(app);
const httpsServer = https.createServer(credentials, app);
const PORT = 18080;
const SSLPORT = 18081;

httpServer.listen(PORT, function() {
    console.log("HTTP Server is running on: http://localhost:%s", PORT);
});
httpsServer.listen(SSLPORT, function() {
    console.log("HTTPS Server is running on: https://localhost:%s", SSLPORT);
});

// Welcome
app.get("/", function(req, res) {
    if(req.protocol === "https") {
        res.status(200).send("Welcome to Safety Land!");
    }
    else {
        res.status(200).send("Welcome!");
    }
});
6. 使用HTTPS向其他网站请求数据

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

let req = https.request(options, callback(res){})

options为一个对象或字符串,用于指定请求的目标的URL地址,如果该参数值为一个字符串,将自动使用URL模块中的parse方法转换为一个对象.在options参数值对象或使用parse方法转换后对象中,可以指定的属性及属性值如下所示

host: 用于指定域名或目标主机的IP地址,默认属性为localhost

hostname: 用于指定域名或目标主机的IP地址,默认属性为localhost, 如果hostname属性值与host属性值都被指定,优先使用hostname属性值

port: 指定目标服务器用于HTTP客户单连接的端口号,默认为443

method: 用于指定HTTP请求方式,默认为GET

path: 用于指定请求路径及查询字符串,默认为/

headers: 用于指定客户端请求头对象

auth: 用于指定认证信息部分,例如user:password

`agent: 用于指定用户代理

当在options参数值对象中使用如下所示的属性及属性值时,不能使用全局https.Agent对象

pfx: 属性值为一个字符串或一个Buffer对象,用于指定从pfx文件读取出的私钥,公钥及证书,使用该属性值不需要指定key属性值,cert属性值以及ca属性值.

key: 属性值为一个字符串或一个Buffer对象,用于指定从后缀名为pem的私钥文件中读取出来的私钥,该属性值为必须指定属性值,除非指定了pfx属性值

passphrase: 属性值为一个字符串,用于为私钥文件或pfx文件指定密码

cert: 属性值为一个字符串或一个Buffer对象,用于指定从后缀名为pem的文件中读物出来的公钥,该属性值为必须指定属性值,除非指定了pfx属性值

ca: 属性值为一个字符串或一个Buffer对象数组,用于指定一组证书,默认属性值为几个著名的证书授权认证中心,比如VerlSign

crl: 属性值为一个字符串或一个Buffer对象数组,用于指定证书吊销列表

ciphers: 属性值为一个字符串值,用于描述需要使用或取消使用的密码.为了阻挡BEAST攻击,推荐奖ciphers属性与honorCipherOrder属性结合使用,以指定非CBC(Cipher-block chaining,密码分组链接)模式的密码优先级,默认属性值为AES128-GCM-SHA256: RC4: HIGH: !MD5: !aNULL: !EDH

rejectUnauthorized:属性值为一个布尔值,如果属性值为true,那么服务器在客户端建立连接后,返回响应前首先验证客户端提交的证书,如果验证失败,触发客户端请求对象的error事件.

7. 创建HTTPS客户端
const https = require("https");
let options = {
    hostname: "github.com",
    port: 443,
    path: "/",
    method: "GET",
    agent: false
}
let req = https.get(options, (res) => {
    console.log("状态码:" + res.statusCode);
    console.log("响应头:" + JSON.stringify(res.headers));
    res.setEncoding("utf8");
    res.on("data", (chunk) => {
        console.log("响应内容:" + chunk);
    });
});

req.setTimeout(1000, (res) => {
    res.abort();
});

req.on("error",  (err) => {
    if (err.code === "ECONNRESET") {
        console.log("socket端口超时");
    } else {
        console.log("在请求数据过程中发生错误,错误代码为:" + err.code)
    }
});
/**
* 状态码:200
* 响应头:{
          "date": "Sun, 25 Feb 2018 14:24:24 GMT",
          "content-type": "text/html; charset=utf-8",
          "transfer-encoding": "chunked",
          "connection": "close",
          "server": "GitHub.com",
          "status": "200 OK",
          "cache-control": "no-cache",
          "vary": "X-PJAX, Accept-Encoding",
          "x-ua-compatible": "IE=Edge,chrome=1",
          "set-cookie": ["logged_in=no; domain=.github.com; path=/; expires=Thu, 25 Feb 2038 14:24:24 -0000; secure; HttpOnly", "_gh_sess=eyJzZXNzaW9uX2lkIjoiMDY1YjM2ZmU4ZGM5MTFlZTliNjllMDI5ZDg0YzQ0ODUiLCJsYXN0X3JlYWRfZnJvbV9yZXBsaWNhcyI6MTUxOTU2ODY2NDUzMywiX2NzcmZfdG9rZW4iOiJ1ck5qWmZTMkpkeGpxMlN2ZzJhbklJM2pvaTJMVWEzWHcvSXEvTGtzVzBrPSJ9--8b5c0c203b3767a35f046b5ea4e375715e4d95be; path=/; secure; HttpOnly"],
          "x-request-id": "1faefb3e691e8adc7e1a7d727c07236f",
          "x-runtime": "0.050658",
          "expect-ct": "max-age=2592000, report-uri="https://api.github.com/_private/browser/errors"",
          "content-security-policy": "default-src "none"; base-uri "self"; block-all-mixed-content; child-src render.githubusercontent.com; connect-src "self" uploads.github.com status.github.com collector.githubapp.com api.github.com www.google-analytics.com github-cloud.s3.amazonaws.com github-production-repository-file-5c1aeb.s3.amazonaws.com github-production-upload-manifest-file-7fdce7.s3.amazonaws.com github-production-user-asset-6210df.s3.amazonaws.com wss://live.github.com; font-src assets-cdn.github.com; form-action "self" github.com gist.github.com; frame-ancestors "none"; img-src "self" data: assets-cdn.github.com identicons.github.com collector.githubapp.com github-cloud.s3.amazonaws.com *.githubusercontent.com; manifest-src "self"; media-src "none"; script-src assets-cdn.github.com; style-src "unsafe-inline" assets-cdn.github.com; worker-src "self"",
          "strict-transport-security": "max-age=31536000; includeSubdomains; preload",
          "x-content-type-options": "nosniff",
          "x-frame-options": "deny",
          "x-xss-protection": "1; mode=block",
          "x-runtime-rack": "0.058378",
          "x-github-request-id": "1B82:60FF:117094:18A2C0:5A92C717"
      }
* 
****/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92900.html

相关文章

  • 1月份前端资源分享

    摘要:更多资源请文章转自月份前端资源分享视频前端技术论坛融合不可错过的迷你库测试框架实例教程为你详细解读请求头的具体含意解析的库如果要用前端框架,开发流程是怎样的与有什么区别正确使用的方法是什么流程图插件小如何让元素只能输入纯文本前端技术中 更多资源请Star:https://github.com/maidishike... 文章转自:https://github.com/jsfront...

    solocoder 评论0 收藏0
  • Node.js学习之路26——Express的response对象

    摘要:如果包含字符则将设置为。添加字段到不同的响应头将该字段添加到不同的响应标头如果它尚未存在。 3. response对象 3.1 是否发送了响应头 res.headersSent布尔属性,app是否发送了httpheaders const express = require(express); const bodyParser = require(body-parser); cons...

    davidac 评论0 收藏0
  • 2017-09-13 前端日报

    摘要:前端日报精选中的垃圾收集,图文指南十个免费的前端开发工具专题之递归如何在链中共享变量基于的爬虫框架中文译十六进制颜色揭秘掘金掘金小书基本环境安装小书教程中间件对闭包的一个巧妙使用简书源码分析掘金组件开发练习焦点图切换前端学 2017-09-13 前端日报 精选 V8 中的垃圾收集(GC),图文指南十个免费的web前端开发工具JavaScript专题之递归 · Issue #49 · m...

    BWrong 评论0 收藏0
  • 2017-06-13 前端日报

    摘要:前端日报点关注,不迷路精选前端团队工作流迁移记译新语法私有属性知乎专栏前端每周清单大前端技术生命周期模型发布面向生产环境的前端性能优化模块实现入门浅析知乎专栏中文一个线下沙龙中国最大的前端技术社区单页面博客从前端到后端基于 2017-06-13 前端日报 点关注,不迷路:-P 精选 ESLint v4.0.0 released - ESLint - Pluggable JavaScri...

    曹金海 评论0 收藏0
  • Node.js学习之路01——不同操作系统下Node.js环境搭建

    摘要:基本介绍这是一个基本的环境搭建不同的操作系统可以选择不同的安装方式如果不需要太多的安装步骤就直接在官网下载最新版安装包进行安装即可环境配置必须安装的软件更改源与更新系统首先备份下载的源配置文件运行生成缓存更新系统安装使用安装命 基本介绍 这是一个基本的Node.js环境搭建,不同的操作系统可以选择不同的安装方式 如果不需要太多的安装步骤,就直接在Node.js官网下载最新版安装包进行...

    meteor199 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<