美文网首页纵横研究院NodeJS技术专题社区
【原创】NodeJs 搭建https服务器

【原创】NodeJs 搭建https服务器

作者: Gelakola | 来源:发表于2019-05-19 18:33 被阅读1次

    1、http、https、http2的关系

    http:目前绝大多数是http1.1版本,最原始的web协议,默认80端口,基于TCP协议。
    https:加密的http协议(http+SSL/TLS),默认443端口,基于TCP协议。
    http2:第二代http协议,相较于HTTP1.x,大幅度的提升了web性能。在与HTTP/1.1完全语义兼容的基础上,进一步减少了网络延迟和传输的安全性,基于TCP协议。

    2、HTTPS服务

    2.1 自建CA

    CA证书一般是第三方网站提供的,大部分是付费的。

    // 1.生成CA私匙,des3代表加密算法,还可以选择aes256等
    openssl genrsa -des3 -out ica.key 1024
    // 2.生成CA证书请求
    openssl req -new -key ica.key -out ssl.csr
    // 3.生成CA根证书
    openssl x509 -req -in ica.csr -extensions v3_ca -signkey ica.key -out ica.crt
    

    2.2 server端证书

    // 1.生成server私匙
    openssl genrsa -out server.key 1028
    // 2.生成server证书请求
    openssl req -new -key server.key -out server.csr
    // 3.生成server证书
    openssl x509 -days 365 -req -in server.csr -extensions  v3_req -CAkey ica.key -CA ica.crt -CAcreateserial -out server.crt  -extfile openssl.cnf
    

    说明:
    openssl.cnf文件内容

    [req]  
        distinguished_name = req_distinguished_name  
        req_extensions = v3_req  
    
        [req_distinguished_name]  
        countryName = CN 
        countryName_default = CN  
        stateOrProvinceName = Beijing  
        stateOrProvinceName_default = Beijing  
        localityName = Beijing 
        localityName_default = Beijing
        organizationalUnitName  = HD
        organizationalUnitName_default  = HD
        commonName = localhost  
        commonName_max  = 64  
    
        [ v3_req ]  
        # Extensions to add to a certificate request  
        basicConstraints = CA:FALSE  
        keyUsage = nonRepudiation, digitalSignature, keyEncipherment  
        subjectAltName = @alt_names  
    
        [alt_names]  
       #注意这个IP.1的设置,IP地址需要和你的服务器的监听地址一样 DNS为server网址,可设置多个ip和dns
        IP.1 = 127.0.0.1
        DNS.1 = localhost
    

    2.3 node.js搭建https服务器

    //使用nodejs自带的http、https模块
    const https = require('https');
    const http = require('http');
    const fs = require('fs');
    const path = require('path');
    const koa = require('koa');
    const app = new koa();
    
    app.on('error', (error, ctx) => {
        console.log('something error ' + JSON.stringify(ctx.onerror));
    });
    
    app.use(async ctx => {
        ctx.body = `This is ${ctx.protocol} visit`;
    });
    
    //根据项目的路径导入生成的证书文件
    const privateKey  = fs.readFileSync(path.join(__dirname, './certificate/server.key'), 'utf8');
    const certificate = fs.readFileSync(path.join(__dirname, './certificate/server.crt'), 'utf8');
    const credentials = {key: privateKey, cert: certificate};
    
    //创建http与HTTPS服务器
    const httpServer = http.createServer(app.callback());
    const httpsServer = https.createServer(credentials, app.callback());
    
    //可以分别设置http、https的访问端口号
    const PORT = 8000;
    const SSLPORT = 8001;
    
    //创建http服务器
    httpServer.listen(PORT, function() {
        console.log('HTTP Server is running on: http://localhost:%s', PORT);
    });
    
    //创建https服务器
    httpsServer.listen(SSLPORT, function() {
        console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
    });
    

    2.4 nginx配置https

    server {
            listen       80;
            server_name  localhost;
            rewrite ^ https://$http_host$request_uri? permanent;   
            # force redirect http to https
        }
    server {
           listen       443 ssl;
            server_name  localhost;
            ssl_certificate      server.crt;
            ssl_certificate_key  server.key;
    
            ssl_session_cache    shared:SSL:1m;
            ssl_session_timeout  5m;
    
            ssl_ciphers  HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers  on;
    
           location / {
                root   D:\myProjects\hmall-pc\src\main\webapp;
                try_files $uri $uri/ @router;
                index hmall-base.html;
            }
        }
    

    2.5 消除浏览器安全警告

    因为我们不是官方的CA机构并没有内置在浏览器或系统中,所以浏览器会认为该CA非法,此时我们需要将我们自建CA的根证书(ica.crt)加入到浏览器中。
    Chrome :设置-设置-设置-高级-隐私设置和安全性-管理证书-导入
    火狐:设置-选项-隐私与安全-证书-查看证书-证书机构-导入
    亲测火狐导入之后有效,chrome的依然有安全警告...


    火狐添加ica.crt之后

    3、加密方式

    3.1 对称加密

    • 对称加密:加密和解密用同一个秘钥的加密,特点是快。


      对称加密
    • 对称加密的算法存在的问题:
      多个客户端的时候,在一端生成一个秘钥,传输秘钥的过程,如果被中间人拦截,秘钥也会被获取。


      多用户对称加密

    3.2 非对称加密

    • 非对称加密:会有一对秘钥公钥和私钥,公钥加密,私钥解密,特点是安全,但是慢。


      非对称加密
    • 非对称加密存在的问题:
      私钥只保存在服务器端,公钥可以发送给所有的客户端。在传输公钥的过程中,有被中间人获取的风险,虽然中间人是无法破解(因为私钥只保存在服务器端,只有私钥可以破解公钥加密的内容),但是公钥被中间人拿到可篡改。


      Man-in-the-MiddleAttack篡改公钥

      如果中间人篡改公钥,客户端和服务器端相互传递的消息容易都是假的。

    3.3 第三方认证

    • 公钥被掉包,是因为客户端无法分辨传回公钥的到底是中间人,还是服务器。在HTTPS中,使用 数字证书(网站信息 + 数字签名)来解决这个问题,中间人拦截后把服务器的公钥替换为自己的公钥,因为数字签名的存在,会导致客户端验证签名不匹配,这样就防止了中间人替换公钥的问题。
      数字签名:将网站的信息加密后通过第三方机构的私钥再次进行加密,生成数字签名。
      第三方证书

    4、https工作机制

    https工作机制
    • client使用公钥A给秘钥X加密,server使用私钥B给秘钥X解密,这一过程是非对称加密。
    • client和server利用对称加密秘钥X的快捷性来加密解密报文

    参考文章:
    https://blog.csdn.net/m0_37263637/article/details/80314093
    https://www.kuacg.com/22672.html
    https://www.jianshu.com/p/b92d4c8cbe05

    相关文章

      网友评论

        本文标题:【原创】NodeJs 搭建https服务器

        本文链接:https://www.haomeiwen.com/subject/xlyraqtx.html