MaxKB配置https ssl访问

目前官方给的方式只能使用Nginx做反向代理的方式,实现https ssl访问。
我将操作过程记录下来,希望能够帮助到其他小伙伴。
我的操作系统是Ubuntu(linux),将Nginx与MaxKB应用部署在同一台服务器上。
如果需要单独部署Nginx,也可以参考此步骤,但需要注意修改代理IP。

MaxKB配置https ssl访问

0、准备工作

  1. 准备好域名,调整好域名解析,使域名可以正确解析到你的主机IP;
  2. 申请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必须要与嵌入的网站同源。

2 个赞

不错的帖子 :+1:

这里 location加上 /api/ { 。。。。} /api/… 似乎就不行了 静态资源就访问不到了 有什么好的解决办法吗

这个跟maxkb的技术讨论过,目前不支持location放在二级目录,只能是根目录里。主要是设计没有考虑到这个情况,把很多路径都写死了,看看后面会不会改善

可以通过 1Panel 为 MaxKB 创建反向代理网站,在证书页面申请证书后直接启用 HTTPS。