目前官方给的方式只能使用Nginx做反向代理的方式,实现https ssl访问。
我将操作过程记录下来,希望能够帮助到其他小伙伴。
我的操作系统是Ubuntu(linux),将Nginx与MaxKB应用部署在同一台服务器上。
如果需要单独部署Nginx,也可以参考此步骤,但需要注意修改代理IP。
MaxKB配置https ssl访问
0、准备工作
- 准备好域名,调整好域名解析,使域名可以正确解析到你的主机IP;
- 申请SSL证书,这个申请方法就不展开说了。
3、调整防火墙策略,如果有墙的话,记得开一下80端口和443端口,MaxKB的应用程序端口(默认8080
)可以不用开放了
1、更新系统
执行以下命令更新系统,确保更新到最新。
sudo apt update && sudo apt upgrade -y
2、安装Nginx
sudo apt install nginx -y
安装成功后可以检查Nginx的状态
sudo systemctl status nginx
3、部署SSL证书
将Nginx版本的证书文件,复制到一个目录中,注意,有两个文件,文件扩展名分别是key和pem。
以下路径仅供参考,可以自行修改。
cd /
mkdir ssl_key
cd /ssl_key
将文件上传到/ssl_key目录,假设文件名是aaa.key和aaa.pem
4、 配置Nginx作为反向代理
创建域名的Nginx服务器块配置文件,该文件位于/etc/nginx/sites-available/目录
sudo vim /etc/nginx/sites-available/ai.xxx.com
此时会进入文本编辑模式,按i
键进入编辑状态。
首先,将以下代码复制进文件中
server {
listen 80;
server_name ai.xxx.com; # 修改标记,这里修改成你的域名
# 强制重定向到HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name ai.xxx.com; # 修改标记,这里修改成你的域名
# 使用你的SSL证书
ssl_certificate /ssl_key/aaa.pem; # 修改标记,这里修改pem证书文件位置
ssl_certificate_key /ssl_key/aaa.key; # 修改标记,这里修改key证书文件位置
# 流式输出
proxy_cache off;
proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 600;
# 其他SSL设置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080; # # 修改标记,修改为应用程序的实际地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
粘贴成功后,按一下Esc
键,退出编辑状态
然后输入:wq
,保存文件并退出编辑器(注意是英文符号)
保存文件后,创建一个符号链接到sites-enabled
目录:
sudo ln -s /etc/nginx/sites-available/ai.xxx.com /etc/nginx/sites-enabled/
5、 配置防火墙
sudo ufw allow 'Nginx Full'
6、 测试Nginx配置
测试Nginx配置文件是否有语法错误:
sudo nginx -t
如果一切正常,重新加载Nginx以应用更改:
sudo systemctl reload nginx
7、 检查访问
现在,你应该能够通过https://ai.xxx.com
访问你的网站了,所有的流量都会被Nginx解密并通过HTTP协议转发给监听在8080端口的应用程序。
后续记得定期更新你的证书就行
另外,我做的配置文件没有加强安全防护,可以参考网上的帖子,加强Nginx本身的安全策略。
附注:更安全的配置文件
可能会需要加强Nginx的安全防护,但不确定是否会影响MaxKB使用,我也尝试了一些参数,以下是我尝试出来的经验,可以供大家参考
server {
listen 80;
server_name ai.xxx.com; # 修改标记,这里修改成你的域名
# 强制重定向到HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name ai.xxx.com; # 修改标记,这里修改成你的域名
# 使用你的SSL证书
ssl_certificate /ssl_key/aaa.pem; # 修改标记,这里修改pem证书文件位置
ssl_certificate_key /ssl_key/aaa.key; # 修改标记,这里修改key证书文件位置
# 流式输出
proxy_cache off;
proxy_buffering off;
chunked_transfer_encoding on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 600;
# 启用HSTS
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 启用 CSP
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; img-src * data:; object-src 'none'; report-uri /csp-report-endpoint";
# 只允许同源页面嵌入
add_header X-Frame-Options SAMEORIGIN;
# 启用 XSS 过滤
add_header X-XSS-Protection "1; mode=block";
# 启用 X-Content-Type-Options
add_header X-Content-Type-Options "nosniff";
# 其他SSL设置
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8080; # # 修改标记,修改为应用程序的实际地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 只允许GET PUT POST DELETE方法
limit_except GET PUT POST DELETE {
deny all; # 拒绝所有其他方法
}
}
# CSP 报告处理端点
location /csp-report-endpoint {
access_log /var/log/nginx/csp_report.log;
return 204;
}
}
限制访问日志
sudo chmod 640 /var/log/nginx/*
sudo chown root:adm /var/log/nginx/*
以上是我尝试出来的方法,但要注意的是,如果使用了MaxKB的第三方嵌入代码,则MaxKB必须要与嵌入的网站同源。