如何使用 Certbot 快速为 Hust OJ 申请 SSL 证书
为 Hust OJ(华中科技大学在线评测系统)配置 HTTPS 是提高安全性的重要步骤。其实是很多群友推荐我出的哈哈哈,但是我太懒了一直没出😂
以下步骤假设您已完成 Hust OJ 的基本部署,且服务器运行环境为 Linux(如 Ubuntu 或 CentOS)。
前置条件
- 域名:确保已为 Hust OJ 配置域名(如
oj.mxdyeah.top
),并将其解析到您的服务器 IP。CDN放在后面讲,期待更新。Cloudflare直接绑定并开启小黄云即可。不需要单独再配置SSL证书。 - 服务器权限:您需要具有 root 权限或使用具有 sudo 权限的用户登录服务器。
- Web 服务:Hust OJ 使用的 Web 服务软件(如 Nginx、Apache、Caddy等)需正确安装和运行。
- Certbot 安装:安装 Certbot 工具。如果未安装,可根据下文的说明操作。
- 确保服务器安全组、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:其他优化(可选)
启用 HSTS
编辑 Nginx 配置文件,添加以下内容以启用 HSTS:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
- 优化证书配置
确保使用最新的 TLS 配置以提高安全性。例如,禁用不安全的 TLS 版本。 给出我的安全配置参考:
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;
常见问题排查
- 80 端口被占用:Certbot 需使用 80 端口,请确保未被其他程序占用。
- DNS 解析错误:检查域名是否正确解析到服务器 IP。
- 续期失败:确保服务器防火墙未阻止 Certbot 的验证请求。
通过以上步骤,您即可为 Hust OJ 配置免费的 Let’s Encrypt SSL 证书,实现 HTTPS 加密访问。希望本教程能帮助您快速部署安全可靠的在线评测系统!