nodejs搭建https服务器

  目录

ssl证书的创建,https服务器的搭建

nodejs搭建https服务器

虽然作者是一名菜鸟前端,但是学习https相关的知识还是必须的。之前看过很多理论的文章,http与https的区别,ssl证书如何起作用的等等,说实话,我都忘记了,今天正好有时间,早上坐地铁就看了相关的文章,刚才写出了一个demo,现在就记录一下整个过程。

http与https区别

  • HTTP: 超文本传输协议 (Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
  • HTTPS:(Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 它是一个URI scheme(抽象标识符体系),句法类同http:体系。用于安全的HTTP数据传输。https:URL表明它使用了HTTP,但HTTPS存在不同于HTTP的默认端口及一个加密/身份验证层(在HTTP与TCP之间)。这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面。

    区别:

  • https协议需要到ca申请证书,一般免费证书很少,需要交费。
  • http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    创建ssl证书

    第一步,安装openssl

    安装openssl,很简单,按照正常的window软件按照下一步按照就可以,下面是下载地址,注意选择是64bit还是32bit哦,我下载了“Win64 OpenSSL v1.1.1a Ligh”这个版本,因为体积小,所以下载了light的版本。
    openssl下载地址
    安装好了之后,配置一下环境变量,这样在哪个文件夹下都可以直接使用openssl命令了。

    第二部,使用openssl创建ssl证书

    这个步骤还是有点小困难,在网上按照有的教程弄不好使,后来找到一个教程,好使,直接贴出命令行代码。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #生成私钥key文件:
    ~ D:\workspace\javascript\nodejs-https>openssl genrsa -out privatekey.pem 1024
    Generating RSA private key, 1024 bit long modulus
    ...........................++++++
    ........++++++
    e is 65537 (0x10001)

    #通过私钥生成CSR证书签名
    ~ D:\workspace\javascript\nodejs-https>openssl req -new -key privatekey.pem -out certrequest.csr
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:CN
    State or Province Name (full name) [Some-State]:Beijing
    Locality Name (eg, city) []:Beijing
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:fens.me
    Organizational Unit Name (eg, section) []:fens.me
    Common Name (eg, YOUR name) []:Conan Zhang
    Email Address []:bsspirit@gmail.com

    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

    # 通过私钥和证书签名生成证书文件
    ~ D:\workspace\javascript\nodejs-https>openssl x509 -req -in certrequest.csr -signkey privatekey.pem -out certificate.pem
    Signature ok
    subject=/C=CN/ST=Beijing/L=Beijing/O=fens.me/OU=fens.me/CN=Conan Zhang/emailAddress=bsspirit@gmail.com
    Getting Private key

注意在通过私钥生成CSR证书签名的时候需要添加一些个人信息。
新生成了3个文件:certificate.pem, certrequest.csr, privatekey.pem

  • privatekey.pem: 私钥
  • certrequest.csr: CSR证书签名
  • certificate.pem: 证书文件
    接下来,直接在nodejs的服务代码中引入相关文件就可以了。

    nodejs创建https服务器

    直接贴代码了,这步骤就很简单了
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    var app = require('express')();
    var fs = require('fs');
    var http = require('http');
    var https = require('https');
    var privateKey = fs.readFileSync('./ssl/privatekey.pem', 'utf8'),
    certificate = fs.readFileSync('./ssl/certificate.pem', 'utf8');
    var credentials = {key: privateKey, cert: certificate};

    var httpServer = http.createServer(app);
    var httpsServer = https.createServer(credentials, app);
    var PORT = 18080;
    var 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!');
    }
    });

好了,https服务器搭建完成,原来这么简单。不过,有个问题,因为这个ssl证书属于个人证书,并不是第三方的安全CA证书,所以在浏览器访问https协议时候会有不安全的提醒文字,这个对于我们测试来说是没问题的,如果想在正规的网站上使用,我们还得去阿里云申请CA证书哦。
最后,本想把本demo的代码上传到github,不过,代码实在是简单,不传了,直接放个截图得了。
img
ssl文件夹里放了3个ssl文件哦。