nickharris808/certkit-action
GitHub: nickharris808/certkit-action
certkit-action 是 certkit 的 GitHub Action 封装,在 CI 中自动重新验证证明证书并在验证失败时阻断构建。
Stars: 0 | Forks: 0
# certkit-action
[](https://github.com/nickharris808/certkit-action/actions/workflows/self-test.yml)
[](#usage)
[](LICENSE)
**在 CI 中重新检查证明证书。如果未通过检查,则使构建失败。**
```
- uses: nickharris808/certkit-action@main
with:
spec: certs/*.spec.json
```
这就是全部的集成过程。每个 spec 的 certificate 都是通过将 `.spec.json` 替换为
`.cert.json` 来推断出的,每个 certificate 都会被独立重新检查,如果有任何被拒绝,作业就会失败。
## 运行效果
该 action 会将一个表格写入作业摘要:
| 项目 | 结果 | 详情 |
|---|---|---|
| `heartbleed` | ACCEPTED | 1 个 obligation 已解除 |
| `bounds-check` | **REFUSED** | 非严格组合要求常量 > 0,但得到 -65535 |
并会对失败的文件进行行内注解,因此拒绝信息会直接显示在 PR diff 中,而不是被埋没在日志里。
## 输入
| 输入 | 默认值 | 含义 |
|---|---|---|
| `spec` | *必填* | 路径或 glob,例如 `certs/*.spec.json` |
| `cert` | 推断 | 显式指定 certificate 路径;如果省略,则从 spec 名称推断 |
| `count` | `false` | 同时运行 `exploit-counter` 并报告确切的过度接受率 |
| `box` | — | 用于计数的变量 box,例如 `payload=0:255,record_len=0:255` |
| `fail-on-refusal` | `true` | 在接入阶段设置为 `false`,以便仅报告而不使构建失败 |
| `certkit-version` | 最新 | 版本指定符,例如 `==0.1.0` — **请固定此版本** |
| `summary` | `true` | 将表格写入作业摘要 |
## 输出
| 输出 | 含义 |
|---|---|
| `accepted` | 接受的 certificate 数量 |
| `refused` | 拒绝的数量 |
| `over-acceptance` | 所计数的 spec 的总过度接受率,如果关闭计数则为空 |
## 计算拒绝的严重程度
```
- uses: nickharris808/certkit-action@main
with:
spec: certs/*.spec.json
count: "true"
box: "payload=0:255,record_len=0:255"
```
随后,被拒绝的 certificate 不仅会报告 guard *确实*是不健全的,还会报告它错误地放行了多少个确切的状态 —— 这就是“检查失败”与“这放行了 509 个状态,大约每 129 次随机抽取就会出现一个”之间的区别。
## 逐步接入
首次推出时设置 `fail-on-refusal: false`。该 action 仍会进行注解和总结;它只是不会阻断流程。一旦现有的 certificate 都没有问题,将其翻转为 `true`。
## 固定版本
```
- uses: nickharris808/certkit-action@main
with:
spec: certs/*.spec.json
certkit-version: "==0.1.0"
```
不设置 `certkit-version` 会安装最新版本,这意味着 checker 的升级可能会在没有 commit 的情况下更改您的构建结果。对于安全关卡来说,这通常是错误的权衡。
## 为什么是脚本,而不是 `run:` 块
验证逻辑位于 `verify.py` 中,而不是内联在 YAML 中,因此它拥有一个测试套件 —— 包含 14 个测试,涵盖了退出代码、globbing、缺失文件、计数路径以及 GitHub 输出和摘要副作用。逻辑嵌入在 YAML 中的 action 是无法测试的,这就是为什么有些 action 损坏了几个月却无人察觉的原因。
在本地运行它们:
```
pip install "certkit@git+https://github.com/nickharris808/certkit@main" "exploit-counter@git+https://github.com/nickharris808/exploit-counter@main" pytest
pytest tests
```
## 范围
该 action 会重新检查您已有的 certificate。它不会生成它们 —— `certkit` 设计上就不包含 solver。请参阅 [`certkit`](https://github.com/nickharris808/certkit) 了解 certificate 的来源。
## 封闭核心
这些包是*检查*的一半。它们有意不包含任何证明搜索,这也是使它们保持足够小巧以便审计的原因 —— 这意味着必须由上游的某个组件来生成 certificate。
对于完整机器字域上的 obligation,枚举法无法扩展,因此需要一种不进行枚举的决策程序:即生成可重放 certificate 的无 solver 消除法。该引擎、从反证中推导出最小 guard 的修复合成器,以及驱动它们的进化搜索**均不**包含在本仓库中,且需付费商业使用。
这种划分是刻意为之且永久的。**checker 是免费的,并且永远都会是** —— 一个您无法独立验证的 certificate 毫无价值,因此对验证收费将违背该格式的初衷。需要付费的是大规模*生产* certificate。
## 工具包的其余部分
| | |
|---|---|
| **[certkit](https://github.com/nickharris808/certkit)** | certificate 格式和独立的 checker |
| **[exploit-counter](https://github.com/nickharris808/exploit-counter)** | 如果 guard 不健全,具体有多少个状态会逃逸 |
| **[crs-mcp](https://github.com/nickharris808/crs-mcp)** | AI 编码 agent 通过 MCP 调用的判定接口 |
| **[soundnessbench](https://github.com/nickharris808/soundnessbench)** | 对上述所有内容进行评分的基准测试 |
| **[certkit-action](https://github.com/nickharris808/certkit-action)** | 在您的 CI 中运行检查 |
| **[pytest-mutation-verified](https://github.com/nickharris808/pytest-mutation-verified)** | 证明您的回归测试确实能够失败 |
| **[cve-proof-corpus](https://huggingface.co/datasets/nickh007/cve-proof-corpus)** | 六个带有机器可检查证明的真实 CVE |
| **[在浏览器中试用](https://huggingface.co/spaces/nickh007/certkit-demo)** | 无需安装;观看伪造证明被拒绝的过程 |
## 许可证
Apache-2.0。
标签:GitHub Actions, 安全规则引擎, 形式化验证, 自动笔记, 证书校验, 逆向工具