08月29, 2022

Https四个文件、原理、配置、抓包

本文主要记录YongHu の 博客配置Https的过程,以及了解到Https的相关知识。

四个文件

  • imyoyo.xyz_bundle.crt为证书文件。
  • imyoyo.xyz_bundle.pem为公钥和证书链文件。
  • imyoyo.xyz.csr为证书签名请求,具体见什么是CSR文件
  • imyoyo.xyz.key为私钥文件。

原理

Https建立的过程:

1.证书验证阶段

  • 浏览器发起 HTTPS 请求。

  • 服务端返回 HTTPS 证书。

  • 客户端验证证书是否合法,如果不合法则提示告警。

2.数据传输阶段

  • 当证书验证合法后,在本地生成随机数。

  • 通过公钥加密随机数,并把加密后的随机数传输到服务端。

  • 服务端通过私钥对随机数进行解密。

  • 服务端通过客户端传入的随机数构造对称加密算法,对返回结果内容进行加密后传输。

配置

配置分为两个部分,浏览器到Nginx服务器的静态资源,Nginx配置Https;

其次Nginx服务器的静态资源和Thinkjs后端的服务,Thinkjs配置Https。

1.Nginx Https配置

server {
    listen 80;
    root /root/blog;
    set $node_port 8360;
    server_name imyoyo.xyz www.imyoyo.xyz;
    index index.js index.html index.htm;
    rewrite ^(.*)$ https://${server_name}$1 permanent; 

    location ^~ /.well-known/acme-challenge/ {
      alias /root/blog/ssl/challenges/;
      try_files $uri = 404;
    }

    location / {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass https://127.0.0.1:$node_port$request_uri;
        proxy_redirect off;
    }

    location = /development.js {
        deny all;
    }
    location = /testing.js {
        deny all;
    }

    location = /production.js {
        deny all;
    }
}
server {
    listen 443 ssl;
    root /root/blog;
    set $node_port 8360;
    server_name imyoyo.xyz www.imyoyo.xyz;
    index index.js index.html index.htm;
    #请填写证书文件的相对路径或绝对路径
    ssl_certificate /etc/nginx/conf.d/imyoyo.xyz_nginx/imyoyo.xyz_bundle.crt; 
    #请填写私钥文件的相对路径或绝对路径
    ssl_certificate_key /etc/nginx/conf.d/imyoyo.xyz_nginx/imyoyo.xyz.key; 
    ssl_session_timeout 5m;
    #请按照以下协议配置
    ssl_protocols TLSv1.2 TLSv1.3; 
    #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; 
    ssl_prefer_server_ciphers on;
    location ^~ /.well-known/acme-challenge/ {
      alias /root/blog/ssl/challenges/;
      try_files $uri = 404;
    }

    location / {
        proxy_http_version 1.1;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass https://127.0.0.1:$node_port$request_uri;
        proxy_redirect off;
    }

    location = /development.js {
        deny all;
    }
    location = /testing.js {
        deny all;
    }

    location = /production.js {
        deny all;
    }
}

2.Thinkjs Https配置

建议开发环境生产环境使用不同的证书。开发环境使用本地的证书,生产环境使用权威机构签发的证书。

开发环境的证书可以使用mkcert在本地生成。mkcert 使用指南:如何快速创建自签名 SSL 证书

Thinkjs Https的配置,需要根据当前环境读取不同证书。

// src/common/config/config.js
const fs = require('fs');
const path = require('path');
const https = require('https');
const isDev = think.env === 'development';

let createServer = function (callback, port, hostName) {
    let option = {
        cert: fs.readFileSync(
            isDev
                ? './ssl/127.0.0.1+2.pem'
                : '/etc/nginx/conf.d/imyoyo.xyz_nginx/imyoyo.xyz_bundle.crt',
        ),
        key: fs.readFileSync(
            isDev
                ? './ssl/127.0.0.1+2-key.pem'
                : '/etc/nginx/conf.d/imyoyo.xyz_nginx/imyoyo.xyz.key',
        ),
    };
    const server = https.createServer(option, callback);
    server.listen(port, hostName);
    return server;
};

let port;
const portFile = path.join(think.ROOT_PATH, 'port');
if (think.isFile(portFile)) {
    port = fs.readFileSync(portFile, 'utf8');
}

let host;
const hostFile = path.join(think.ROOT_PATH, 'host');
if (think.isFile(hostFile)) {
    host = fs.readFileSync(hostFile, 'utf8');
}

module.exports = {
    host: host || process.env.HOST || '0.0.0.0',
    port: port || process.env.PORT || 8360,

    /**  theme editor */
    DISALLOW_FILE_EDIT: process.env.DISALLOW_FILE_EDIT || false,
    createServer: createServer,
};

抓包

Charles是一款抓包工具。可以对数据包进行代理。当没有配置SSL Proxy时,无法抓去Https数据包,显示为unknown。

可以对Charles进行配置,抓去Https数据包。原理:下载Charles证书,使的本机信任,让Charles做中间人。

参考文献

本文链接:https://imyoyo.xyz/post/https-file-theory-config-network.html

-- EOF --

Comments