95 lines
4.4 KiB
Markdown
95 lines
4.4 KiB
Markdown
# 01. TAL(Trust Anchor Locator)
|
||
|
||
## 1.1 对象定位
|
||
|
||
TAL(Trust Anchor Locator)用于向 RP 提供:
|
||
|
||
1) 可检索“当前 TA 证书”的一个或多个 URI;以及
|
||
2) 该 TA 证书的 `subjectPublicKeyInfo`(SPKI)期望值(用于绑定/防替换)。
|
||
|
||
RFC 8630 §2;RFC 8630 §2.3。
|
||
|
||
## 1.2 原始载体与编码
|
||
|
||
- 载体:文本文件(ASCII/UTF-8 兼容的行文本)。
|
||
- 行结束:允许 `CRLF` 或 `LF`。RFC 8630 §2.2。
|
||
- 结构:`[可选注释区] + URI 区 + 空行 + Base64(SPKI DER)`。RFC 8630 §2.2。
|
||
|
||
### 1.2.1 注释区
|
||
|
||
- 一行或多行,以 `#` 开头,后随人类可读 UTF-8 文本。RFC 8630 §2.2。
|
||
- 注释行文本需符合 RFC 5198 §2 的限制(RFC 8630 §2.2 引用)。
|
||
|
||
### 1.2.2 URI 区
|
||
|
||
- 一行或多行,每行一个 TA URI,按序排列。RFC 8630 §2.2。
|
||
- TA URI **MUST** 是 `rsync` 或 `https`。RFC 8630 §2.2。
|
||
|
||
### 1.2.3 空行分隔
|
||
|
||
- URI 区后必须有一个额外的换行(即空行),用于与 Base64 区分隔。RFC 8630 §2.2(第 3 点)。
|
||
|
||
### 1.2.4 SPKI(Base64)
|
||
|
||
- `subjectPublicKeyInfo` 以 DER 编码(ASN.1)后,再 Base64 编码表示。RFC 8630 §2.2(第 4 点)。
|
||
- 为避免长行,Base64 字符串中 **MAY** 插入换行。RFC 8630 §2.2。
|
||
- SPKI ASN.1 类型来自 X.509 / RFC 5280。RFC 8630 §2.2(第 4 点);RFC 5280 §4.1.2.7。
|
||
|
||
#### 1.2.4.1 `SubjectPublicKeyInfo` 的 ASN.1 定义(RFC 5280 §4.1)
|
||
|
||
TAL 中携带的是一个 X.509 `SubjectPublicKeyInfo` 的 DER 字节串(再 Base64)。其 ASN.1 定义如下:RFC 5280 §4.1。
|
||
|
||
```asn1
|
||
SubjectPublicKeyInfo ::= SEQUENCE {
|
||
algorithm AlgorithmIdentifier,
|
||
subjectPublicKey BIT STRING }
|
||
```
|
||
|
||
其中 `algorithm`/`subjectPublicKey` 的取值受 RPKI 算法 profile 约束(例如 RSA 2048 + SHA-256 等;SKI/AKI 计算仍用 SHA-1)。RFC 5280 §4.1.2.7;RFC 7935 §2-§3.1;RFC 6487 §4.8.2-§4.8.3。
|
||
|
||
## 1.3 解析规则(语义层)
|
||
|
||
输入:`TalFileBytes: bytes`。
|
||
|
||
解析步骤:
|
||
|
||
1) 按 `LF` / `CRLF` 识别行。RFC 8630 §2.2。
|
||
2) 从文件开头读取所有以 `#` 开头的行,作为 `comments`(保留去掉 `#` 后的 UTF-8 文本或保留原始行均可,但需保持 UTF-8)。RFC 8630 §2.2。
|
||
3) 继续读取一行或多行非空行,作为 `ta_uris`(保持顺序)。RFC 8630 §2.2(第 2 点)。
|
||
4) 读取一个空行(必须存在)。RFC 8630 §2.2(第 3 点)。
|
||
5) 将剩余行拼接为 Base64 文本(移除行分隔),Base64 解码得到 `subject_public_key_info_der`。RFC 8630 §2.2(第 4 点)。
|
||
6) 可选:将 `subject_public_key_info_der` 解析为 X.509 `SubjectPublicKeyInfo` 结构(用于与 TA 证书比对)。RFC 8630 §2.3;RFC 5280 §4.1.2.7。
|
||
|
||
URI 解析与约束:
|
||
|
||
- `ta_uris[*]` 的 scheme **MUST** 为 `rsync` 或 `https`。RFC 8630 §2.2。
|
||
- 每个 `ta_uri` **MUST** 指向“单个对象”,且 **MUST NOT** 指向目录或集合。RFC 8630 §2.3。
|
||
|
||
## 1.4 抽象数据模型(接口)
|
||
|
||
### 1.4.1 `Tal`
|
||
|
||
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|
||
|---|---|---|---|---|
|
||
| `raw` | `bytes` | TAL 原始文件字节 | 原样保留(可选但建议) | RFC 8630 §2.2 |
|
||
| `comments` | `list[Utf8Text]` | 注释行(按出现顺序) | 每行以 `#` 开头;文本为 UTF-8;内容限制见 RFC 5198 §2 | RFC 8630 §2.2 |
|
||
| `ta_uris` | `list[Uri]` | TA 证书位置列表 | 至少 1 个;按序;每个 scheme 必须是 `rsync` 或 `https` | RFC 8630 §2.2 |
|
||
| `subject_public_key_info_der` | `DerBytes` | TA 证书 SPKI 的期望 DER | Base64 解码所得 DER;Base64 中可有换行 | RFC 8630 §2.2 |
|
||
|
||
### 1.4.2 `TaUri`(可选细化)
|
||
|
||
> 若你的实现希望对 URI 做更强类型化,可在 `Tal.ta_uris` 上进一步拆分为 `TaUri` 结构。
|
||
|
||
| 字段 | 类型 | 语义 | 约束/解析规则 | RFC 引用 |
|
||
|---|---|---|---|---|
|
||
| `uri` | `Uri` | 完整 URI 文本 | scheme 为 `rsync` 或 `https` | RFC 8630 §2.2 |
|
||
| `scheme` | `enum` | `rsync` / `https` | 从 `uri` 解析 | RFC 8630 §2.2 |
|
||
|
||
## 1.5 字段级约束清单(实现对照)
|
||
|
||
- TAL 由(可选)注释区 + URI 区 + 空行 + Base64(SPKI DER) 组成。RFC 8630 §2.2。
|
||
- URI 区至少 1 行,每行一个 TA URI,顺序有意义。RFC 8630 §2.2。
|
||
- TA URI 仅允许 `rsync` 或 `https`。RFC 8630 §2.2。
|
||
- Base64 区允许插入换行。RFC 8630 §2.2。
|
||
- 每个 TA URI 必须引用单个对象,不能指向目录/集合。RFC 8630 §2.3。
|