博主头像
mxd's Blog

"The quieter you become,the more you are able to hear."

如何使用 Certbot 快速为 Hust OJ 申请 SSL 证书

为 Hust OJ(华中科技大学在线评测系统)配置 HTTPS 是提高安全性的重要步骤。其实是很多群友推荐我出的哈哈哈,但是我太懒了一直没出😂

以下步骤假设您已完成 Hust OJ 的基本部署,且服务器运行环境为 Linux(如 Ubuntu 或 CentOS)。


前置条件

  1. 域名:确保已为 Hust OJ 配置域名(如 oj.mxdyeah.top),并将其解析到您的服务器 IP。CDN放在后面讲,期待更新。Cloudflare直接绑定并开启小黄云即可。不需要单独再配置SSL证书。
  2. 服务器权限:您需要具有 root 权限或使用具有 sudo 权限的用户登录服务器。
  3. Web 服务:Hust OJ 使用的 Web 服务软件(如 Nginx、Apache、Caddy等)需正确安装和运行。
  4. Certbot 安装:安装 Certbot 工具。如果未安装,可根据下文的说明操作。
  5. 确保服务器安全组、Debian Linux中自带的ufw防火墙 已放行 80、443端口的TCP协议,如果需要HTTP/3则还需要放行443端口的UDP协议。

步骤 1:安装 Certbot

对于基于 Debian/Ubuntu 的系统:

sudo apt update
sudo apt install certbot python3-certbot-nginx

对于基于 CentOS/RHEL 的系统:

sudo yum install epel-release
sudo yum install certbot python3-certbot-nginx

如果您使用的是 Apache,需将 python3-certbot-nginx 替换为 python3-certbot-apache


步骤 2:配置 Web 服务

为了方便,此处仅列出大多数人使用的 Nginx 的配置方法。Apache、Caddy的配置可以参考 Nginx 的配置方法。

在配置证书前,确保 Hust OJ 的 Nginx/Apache 配置文件已启用域名。
Nginx的默认主目录在/etc/nginx下,一会儿我会在这个目录里面进行修改。


目录下,主要有以下几个文件和目录:

nginx.conf:主配置文件,包含全局的配置指令和引入其他配置文件的指令。

conf.d:配置文件目录,用于存放分散的配置片段,以 .conf 结尾。

sites-available:虚拟主机配置文件目录,用于存放每个虚拟主机的配置文件。

sites-enabled:启用的虚拟主机配置文件目录的符号链接,通过链接到 sites-available 下的配置文件来启用虚拟主机。ps:链接就是指这两个文件夹里面的文件及其内容都是一样的。(此处的虚拟主机就是指每个不同的网站或域名)


Hust OJ的默认网站配置文件在/etc/nginx/sites-enabled/default下,Nginx主配置文件与默认一样,在/etc/nginx/nginx.conf我们不推荐把所有(可能是多个甚至更多)的网站全部堆到一个文件里面。

default是Nginx安装及Hust OJ默认的配置文件。但我们推荐将其改名为hustoj.conf,因为考虑到有用户需要配置多个网站。(群里积累的经验,很多小白新建网站导致脚本不能正常进行,每个文件单独区分开不容易搞混)

改名命令行:

sudo mv /etc/nginx/sites-enabled/default /etc/nginx/sites-enabled/hustoj.conf

然后,Nginx 配置文件hustoj.conf更改/添加/对照/参考以下版本进行修改,注意此处不能有443及SSL证书的配置,如果你之前有,请删掉

server
{
    listen 80;
    listen [::]:80;
    server_name oj.mxdyeah.top;
    index index.php index.html index.htm default.php default.htm default.html;
    root /home/judge/src/web;
    error_page 404 /404.html;
    #error_page 502 /502.html;

    #PHP-INFO-START  
    #PHP引用配置,可以注释或修改,hustoj 默认是用一个location块来连接PHP,保留它,请不要写我这个。
    #include enable-php-83.conf;
    #PHP-INFO-END

    #禁止访问的文件或目录,防止检测到你用了哪些库。
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }

    #禁止在证书验证目录放入敏感文件
    if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
        return 403;
    }
    access_log  /var/log/nginx/oj.mxdyeah.top.access.log;
    error_log  /var/log/nginx/oj.mxdyeah.top.error.log;
}

保存后,重新加载服务:

sudo systemctl reload nginx

步骤 3:申请 SSL 证书

运行以下 Certbot 命令以自动申请和配置证书:

Nginx 用户:

sudo certbot --nginx -d oj.mxdyeah.top

Apache 用户:

sudo certbot --apache -d oj.mxdyeah.top

Certbot 会自动检测您的 Web 服务配置并添加 HTTPS 支持。执行过程中,您需同意服务条款并选择是否将所有 HTTP 流量重定向到 HTTPS。

多域名,多网站期待后续更新。


步骤 4:测试 HTTPS 配置

申请成功后,Certbot 会自动为您的 Hust OJ 配置 SSL。您可以访问 https://oj.example.com 检查是否生效。

使用以下命令验证证书的状态:

sudo certbot certificates

步骤 5:自动续期

Certbot 默认会安装定时任务以自动续期证书,但您可以手动测试:

sudo certbot renew --dry-run

如果没有错误,则续期配置正常。


步骤 6:其他优化(可选)

  1. 启用 HSTS
    编辑 Nginx 配置文件,添加以下内容以启用 HSTS:

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  2. 优化证书配置
    确保使用最新的 TLS 配置以提高安全性。例如,禁用不安全的 TLS 版本。
  3. 给出我的安全配置参考:

     ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
     ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
     ssl_prefer_server_ciphers on;
     ssl_session_cache shared:SSL:10m;
     ssl_session_timeout 10m;
     add_header Strict-Transport-Security "max-age=31536000";
     add_header Alt-Svc 'quic=":443"; h3=":443"; h3-29=":443"; h3-27=":443";h3-25=":443"; h3-T050=":443"; h3-Q050=":443";h3-Q049=":443";h3-Q048=":443"; h3-Q046=":443"; h3-Q043=":443"';
     error_page 497  https://$host$request_uri;

常见问题排查

  1. 80 端口被占用:Certbot 需使用 80 端口,请确保未被其他程序占用。
  2. DNS 解析错误:检查域名是否正确解析到服务器 IP。
  3. 续期失败:确保服务器防火墙未阻止 Certbot 的验证请求。

通过以上步骤,您即可为 Hust OJ 配置免费的 Let’s Encrypt SSL 证书,实现 HTTPS 加密访问。希望本教程能帮助您快速部署安全可靠的在线评测系统!

如何使用 Certbot 快速为 Hust OJ 申请 SSL 证书
https://blog.mxdyeah.top/mxdyeah_blog_post/certbot_request_ssl_hustoj.html
本文作者 mxdyeah
发布时间 2025-01-01
许可协议 CC BY-NC-SA 4.0
发表新评论