CANARYPWN'S NATÏVE BLOG
Canarypwn
Jul 7, 2020
It takes 5 minutes to read this article.

Pigeon OJ

Pigeon OJ 是由上海科技大学 GeekPie 社团开发的一个基于 Docker 和 Gitlab 的多文件在线评测系统。

在上学期的 CS100 后,该 OJ 已经尘封了一个学期了。 在下个学期的 SI100B 中,该 OJ 也会给新来的 20 届同学使用。在暑学期中, 该 OJ 还要为 专硕 的项目服务。

OJ 的评卷系统是通过一个 scheduler 通过 TLS 连接 Docker API 调用 Docker 进行评卷。之前的评卷机在 CS100 课程结束后就被学校收回了。 所以现在我需要为其添加一个新的评卷机 ( Judger )

# Docker Remote API TLS 认证

参考链接: https://www.jianshu.com/p/a1bdc96b4163

这里是我的配置:

openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN={你的域名}" -sha256 -new -key server-key.pem -out server.csr
echo subjectAltName = DNS:{你的域名} > extfile.cnf
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
rm -v client.csr server.csr
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem

其中, {你的域名} 替换为你的域名 (e.g. aaaab3n.oj.geekpie.club),或者直接使用 ip 。

之后会生成 ca-key.pem key.pem server-key.pem ca.pem server-cert.pem cert.pem

我创建了 ~/.docker 目录并把 ca.pem server-cert.pem server-key.pem 放入。

之后编辑 /lib/systemd/system/docker.service


ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -D -H tcp://0.0.0.0:443 --tlsverify --tlscacert=/home/canary/.docker/ca.pem --tlscert=/home/canary/.docker/server-cert.pem --tlskey=/home/canary/.docker/server-key.pem


这里有一个小坑是生成证书的时候我的本地时间没有调整为标准时间,因此之后 TLS 握手时出错。

测试

cert.pem key.pem ca.pem 传输到目标机器,运行命令 curl https://{你的域名 / IP }:443/info --cert ./cert.pem --key ./key.pem --cacert ./ca.pem

OJ 配置

  • Client Key -> key.pem
  • Client Cert -> cert.pem
  • Cert CA -> ca.pem
  • MAx job -> CPU逻辑处理器数

结合之前一篇文章,我将3900X处理器分配了12个线程给OJ使用。

使用感受

就感觉到快,有催人AC的意思