跳到主要内容

附录 B. 使用 TLSA 的伪代码 (Pseudocode for Using TLSA)

本附录以 pseudocode 形式描述本规范前文给出的交互. 如果以下步骤与本文档前文正文不一致, 应以前文正文为准, 本附录文本为误. 注意, 该 pseudocode 比规范性正文更严格. 例如, 它强制规定了评估 criteria 的顺序, 而规范性正文并不要求这种顺序.

B.1. 辅助函数 (Helper Functions)​

Finish(F) 根据结果中止 TLS handshake, 阻止 TLS 启动, 回退到非 TLSA certificate validation, 或接受 TLS connection.

Select(S, X) 根据 selector 返回 certificate 的比较输入: selector 0 返回 DER encoding 中的完整 certificate, selector 1 返回 DER encoding 中的 SubjectPublicKeyInfo.

Match(M, X, Y) 根据 matching type 执行比较: matching type 0 对 selected content 做 exact match, matching type 1 比较 SHA-256(X) 与 Y, matching type 2 比较 SHA-512(X) 与 Y.

B.2. 主要 TLSA 伪代码 (Main TLSA Pseudocode)​

TLS client 使用 [transport] 连接到 [name] 的 [port], 并接收 TLS server 的 end entity certificate C. client 对 _[port]._[transport].[name] 执行 DNSSEC-validated lookup, 查询 RRtype TLSA, 得到 TLSArecords 和 ValState.

如果 ValState 为 BOGUS, client 调用 Finish(ABORT_TLS). 如果 ValState 为 INDETERMINATE 或 INSECURE, client 调用 Finish(NO_TLSA). 如果 validation state 为 SECURE, client 删除所有不可用 records, 包括 unknown certUsage, unknown selectorType, unknown matchingType, erroneous RDATA, 以及 local policy 禁止的 records.

如果没有剩余 TLSA records, client 回退到非 TLSA certificate validation. 否则, client 逐条检查 TLSA records: usage 0 要求 PKIX validation 通过, 且 certification path 中有来自 TLSA 的匹配 CA certificate; usage 1 要求 PKIX validation 通过, 且 end entity certificate 匹配 TLSA; usage 2 使用匹配 TLSA record 的 certificate 作为 trust anchor 执行 PKIX validation; usage 3 直接匹配 TLSA record 与 TLS certificate. 若没有任何 TLSA record 产生 Finish(ACCEPT), client 最终调用 Finish(ABORT_TLS).