本文主要记录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做中间人。
Comments