本文档中的关键词 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"MAY" 和 "OPTIONAL" 应按照 RFC 2119 中的描述进行解释。
比较版本时:
比较示例:
清单文件提供关于 VEX 数据仓库的元数据。 该文件必须包含获取和更新 VEX 数据所需的信息。
https://<domain>/.well-known/vex-repository.jsonvex-repository.json 必须放置在 main 分支的根目录中。清单文件的 JSON 模式定义在此处。
{
"name": "Example Org VEX Repository",
"description": "VEX repository for Example Organization",
"versions": [
{
"spec_version": "0.1",
"locations": [
{
"url": "https://example.com/vex-hub/v0/vex-data-v0.tar.gz"
}
],
"update_interval": "24h",
"repository_specific": {
"location": {
"repository_type": "db",
"db_type": "bbolt",
"url": "oci://ghcr.io/example.com/vex-db:0"
}
}
},
{
"spec_version": "1.0",
"locations": [
{
"url": "https://example.com/vex-hub/v1/vex-data-v1.tar.gz//subdirectory"
},
{
"url": "https://example.com/vex-api/v1"
}
],
"update_interval": "1h"
}
]
}
| 字段 | 必填 | 说明与使用说明 |
|---|---|---|
| name | ✓ | 仓库的名称。 |
| description | ✓ | 仓库的简要描述。 |
| versions | ✓ | 包含可用版本详细信息的数组。数组中的每个对象代表一个实现某个 VEX 仓库规范版本的版本。版本必须按升序排列,从最旧到最新。子字段请参阅单独的表格。 |
仓库必须具有以下结构:
vex-repository.<archive_extension>
[optional_subdirectory/]
├── index.json
└── pkg/
├── <type>/
│ ├── <namespace>/
│ │ ├── <name>/
│ │ │ └── vex.json
│ │ └── ...
│ └── ...
└── ...
其中 <archive_extension> 是支持的归档格式之一。
当 locations 字段中的 URL 以 // 加子目录路径结尾时,将包含 [optional_subdirectory/]。
这为仓库结构提供了灵活性,特别是在使用现有仓库布局(如 GitHub 仓库中的布局)时。
例如,如果 URL 为 https://github.com/org/repo/archive/refs/heads/main.tar.gz//repo-main,则文件结构为:
main.tar.gz
└──repo-main/
├── index.json
└── pkg/
└── ...
在这种情况下,repo-main/ 是 tar.gz 文件内 VEX 仓库的根目录。
index.json 文件用作归档文件内容的清单。 它必须放置在归档文件的根目录中,或者如果 URL 中定义了子目录,则放置在该指定子目录中。 该文件必须具有以下结构:
{
"updated_at": "2023-07-04T12:00:00Z",
"packages": [
{
"id": "pkg:deb/debian/curl",
"location": "pkg/deb/debian/curl/vex.json"
},
{
"id": "pkg:npm/lodash",
"location": "pkg/npm/lodash/vex.json",
"format": "csaf"
}
]
}
字段说明:
索引文件的模式定义在此处。
每个软件包的 VEX 信息必须存储在单独的 JSON 文件中,并遵循 index.json 文件中定义的路径结构。这些文件的内容必须符合 format 字段中指定的 VEX 格式规范(OpenVEX 或 CSAF VEX)。
单个 VEX 文档可以包含同一软件包的不同版本、限定符和子路径的信息。
有关 OpenVEX 文档示例,请参阅 OpenVEX 规范。
repository_url 限定符来创建目录结构。例如,PURL 为 "pkg:oci/debian@sha256:3e45770a143ee5afd1ebde5a6aea6e32a71d2bt5602f5dac8025db0d9cc19f10?repository_url=docker.io/library/debian" 的软件包可以存储在 "pkg/oci/docker.io/library/debian/vex.json" 中。location 字段中自由定义,无论建议的结构如何。更新 VEX 仓库时:
updated_at 时间戳。locations URL。VEX 仓库必须以包含 VEX 数据和相关元数据的归档文件的形式分发。 该归档文件必须由 vex-repository.json 文件中的 locations 字段引用,并且是分发 VEX 信息的主要方式。
归档文件必须是以下格式之一:
tar.gz 和 tgztar.bz2 和 tbz2tar.xz 和 txzzipgzbz2xz从 versions 数组中选择版本时:
spec_version 字段选择其支持的版本。处理 locations 数组中的多个位置时:
客户端应该设计为支持多个 VEX 仓库。
客户端应该使用以下过程检查更新:
update_interval。update_interval 添加到本地存储的时间戳来计算下次更新时间。为了提高运行效率,客户端可以实施以下策略:
update_interval 很短的情况下。| 字段 | 必填 | 说明与使用说明 |
|---|
| spec_version | ✓ | 所实现的 VEX 仓库规范的版本(例如 "0.1")。格式必须为第 1 节中定义的 "X.Y"。 |
| locations | ✓ | 描述 VEX 数据位置的对象数组。必须至少包含一个位置对象。子字段请参阅单独的表格。 |
| update_interval | ✓ | 该版本 VEX 数据的推荐更新检查间隔。使用 Go 持续时间格式(例如 "1h"、"30m"、"24h")。 |
| repository_specific | - | 额外的仓库特定信息。 |
| 字段 | 必填 | 说明 |
|---|
| updated_at | ✓ | 时间戳,表示此 index.json 最后一次更新的时间。 |
| packages | ✓ | 对象数组,每个对象代表仓库中的一个软件包。 |
| packages[].id | ✓ | 软件包的标识符。目前仅接受软件包 URL(PURL)。版本、限定符和子路径必须省略,因为它们已包含在 VEX 文档中。对于 OCI 类型的软件包,repository_url 限定符必须包含在 id 中。 |
| packages[].location | ✓ | 归档中此软件包 VEX 文件的相对路径。客户端必须使用此字段来定位特定软件包的 VEX 文件。 |
| packages[].format | - | VEX 数据的格式,为 "openvex" 或 "csaf"。如果省略,则默认为 "openvex"。 |