32

Https在各种Web服务器下配置

 4 years ago
source link: https://www.tuicool.com/articles/FN3iema
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

前言

前端很多情况需要用启动web服务器,而为了保证数据的安全性,都需要用 Https 对传输的数据进行加密传输,而且有些 web-view 只允许 https 通过访问,所以学习怎么配置 https 也成为大前端不可以少的功课之一。下面本妹子将先简单介绍下 Https ,再依次介绍怎么在 Nodewebpack-dev-servernginx 这三个最常见的前端web服务器下配置 Https ,以及关于证书的扩展干货。

Https简介

Https 协议的主要作用可以分为两点:

1.建立一个信息安全通道,来保证数据传输的安全;

2.确认网站的真实性;

https 的加密方式主要是非对称加密,所以会有一对密钥,分别是一个公钥(证书)和私钥。

ZrqEFve.png!web

浏览器allen访问的时候,客户端会接受这个证书,并利用这个证书里的公钥对数据加密,加密后,服务端tony用自己的私钥解密就行了。

Web服务一般使用 OpenSSL 工具提供的密码库,生成PEM、KEY、CRT等格式的证书文件。

其中 .crt 后缀一般存放证书, .key 后缀一般存放私钥, .pem 后缀的可以同时存放把CA证书和密钥。

生成证书和密钥

可以直接用命令生成

#使用以下命令生成一个证书密钥对 key.pem 和 cert.pem,它将有效期约10年(准确地说是3650天)
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.key -out cert.crt
#或者直接生成到一个pem文件中
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout all.pem -out all.pem

可以用 selfsigned 插件生成

const selfsigned = require('selfsigned');
var selfsigned = require('selfsigned');
var attrs = [{ name: 'commonName', value: 'contoso.com' }];
//有效期约10年
var pems = selfsigned.generate(attrs, { days: 3650 });
fs.writeFileSync('all.pem', pems.private + pems.cert, { encoding: 'utf-8' });

node配置https

用openssl生成all.pem

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout all.pem -out all.pem

在同目录编写 app.js ,并运行 node app.js ,启动 node 服务监听 88 端口

var https = require('https');
const fs = require('fs');
const path = require('path');

const options = {
  key: fs.readFileSync(path.resolve(__dirname, './all.pem')),//密钥
  cert: fs.readFileSync(path.resolve(__dirname, './all.pem'))//证书
};
https.createServer(options, (request, response)=> {
    // 发送 HTTP 头部 
    // HTTP 状态值: 200 : OK
    // 内容类型: text/plain
    response.writeHead(200, {'Content-Type': 'text/plain'});
    // 发送响应数据 "Hello World"
    response.end('Hello World\n');
}).listen(88);

// 终端打印如下信息
console.log('Server running at https://127.0.0.1:88/');

bQZVbq2.png!web

具体代码可查看 https://github.com/raoenhui/node-https.git

web-dev-server 配置https

web-dev-server配置很简单,只要将 https 选项设成 true 即可。

module.exports = {
  devServer: {
    https: true
  }
};

web-dev-server原理

server.js里面判断如果没有证书和密钥,则用 selfsigned 生成,并放在ssl目录中的 server.pem 文件下,默认生成有效期为 30 天。

const certPath = path.join(__dirname, '../ssl/server.pem');
      let certExists = fs.existsSync(certPath);
      ...
      if (!certExists) {
        log('Generating SSL Certificate');
        const attrs = [{ name: 'commonName', value: 'localhost' }];
        const pems = selfsigned.generate(attrs, {
          algorithm: 'sha256',
          days: 30,
          keySize: 2048,
          extensions: [...]
        });

        fs.writeFileSync(certPath, pems.private + pems.cert, { encoding: 'utf-8' });
      }
      fakeCert = fs.readFileSync(certPath);

启动服务的时候引用证书和密钥

options.https.key = options.https.key || fakeCert;
    options.https.cert = options.https.cert || fakeCert;
    ...
    this.listeningApp = spdy.createServer(options.https, app);

Nginx 配置https

# 进入nginx目录
cd nginx
# 在key文件夹中用openssl生成
mkdir key && cd key && openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout all.pem -out all.pem
# HTTPS server
    #
    server {
        listen       443 ssl;
        server_name  localhost;
        #证书路径
        ssl_certificate      key/all.pem;
        ssl_certificate_key  key/all.pem;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /HD/mycode/test;
            index  index.html index.htm;
        }
    }

知识扩展

其他证书格式

上面本妹子所讲的是对于前端比较常见的web服务器,而其实还有很多种服务器它们的证书格式是不一样的,而且可以互相转换,具体如下图所示

Q73eAfb.png!web

CA

CA全称为Certificate Authority 证书授权中心。上面本妹子是自己生成证书,这个证书在互联网上是认为不安全的。只有通过CA机构下发的证书,浏览器和电脑才会认为是可靠安全的。

其中证书也有很多分类,可以向CA申请不同类型的证书。下面举例几种常见证书类型的区别

fUnumu3.png!web

还可以用SSL证书在线检测工具,检测网站证书详细信息。

https://www.chinassl.net/ssltools/ssl-checker.html

如www.jd.com

IfQZ3uB.png!web

mEjeqiA.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK