3.1. 日志条目
3.1. 日志条目
任何人都可以向任何日志提交证书。为了能够将每个记录的证书归属于其颁发者,日志应当(SHALL)公布可接受的根证书列表(此列表可以是主要浏览器供应商信任的根证书的并集)。每个提交的证书必须(MUST)附带验证证书链所需的所有附加证书,直到可接受的根证书。根证书本身可以(MAY)从提交给日志服务器的链中省略。
或者,(根证书以及中间)证书颁发机构可以在颁发之前将证书提交给日志。为此,CA提交预证书(Precertificate),日志可以使用它来创建对已颁发证书有效的条目。预证书是通过向要颁发的证书的最终实体TBSCertificate添加特殊的关键毒扩展(OID 1.3.6.1.4.1.11129.2.4.3,其extnValue OCTET STRING包含ASN.1 NULL数据(0x05 0x00))来构建的(此扩展是为了确保预证书不能被标准X.509v3客户端验证),并使用以下之一对生成的TBSCertificate [RFC5280]进行签名:
-
特殊用途(CA:true,扩展密钥用法:Certificate Transparency,OID 1.3.6.1.4.1.11129.2.4.4)预证书签名证书。预证书签名证书必须(MUST)直接由最终将签署最终实体TBSCertificate产生最终实体证书的(根或中间)CA证书认证(请注意,日志可以放宽标准验证规则以允许这样做,只要颁发的证书有效即可),
-
或者,将签署最终证书的CA证书。
如上所述,预证书提交必须(MUST)附带预证书签名证书(如果使用)以及验证链所需的所有附加证书,直到可接受的根证书。TBSCertificate上的签名表示证书颁发机构打算颁发证书。此意图被视为具有约束力(即,预证书的错误颁发被视为等同于最终证书的错误颁发)。每个日志验证预证书签名链并在相应的TBSCertificate上颁发签名证书时间戳。
日志必须(MUST)验证提交的最终实体证书或预证书是否具有有效的签名链,使用提交者提供的中间CA证书链回溯到受信任的根CA证书。日志可以(MAY)接受已过期、尚未生效、已被吊销或根据X.509验证规则不完全有效的证书,以适应CA证书颁发软件的怪癖。但是,日志必须(MUST)拒绝发布没有到已知根CA的有效链的证书。如果证书被接受并颁发了SCT,接受日志必须(MUST)存储用于验证的整个链,包括证书或预证书本身以及用于验证链的根证书(即使在提交时省略了它),并且必须(MUST)应请求提供此链用于审计。此链是防止CA通过记录部分或空链来逃避责任所必需的。(注意:这有效地排除了自签名证书和基于DANE的证书,直到找到控制这些证书垃圾邮件的某种机制。作者欢迎建议。)
日志中的每个证书条目必须(MUST)包括以下组件:
enum { x509_entry(0), precert_entry(1), (65535) } LogEntryType;
struct {
LogEntryType entry_type;
select (entry_type) {
case x509_entry: X509ChainEntry;
case precert_entry: PrecertChainEntry;
} entry;
} LogEntry;
opaque ASN.1Cert<1..2^24-1>;
struct {
ASN.1Cert leaf_certificate;
ASN.1Cert certificate_chain<0..2^24-1>;
} X509ChainEntry;
struct {
ASN.1Cert pre_certificate;
ASN.1Cert precertificate_chain<0..2^24-1>;
} PrecertChainEntry;
日志可以(MAY)限制它们将接受的链的长度。
"entry_type"是此条目的类型。此协议版本的未来修订版可能会添加新的LogEntryType值。第4节解释了客户端应如何处理未知的条目类型。
"leaf_certificate"是提交用于审计的最终实体证书。
"certificate_chain"是验证最终实体证书所需的附加证书链。第一个证书必须(MUST)认证最终实体证书。后续每个证书必须(MUST)直接认证前一个证书。最终证书必须(MUST)是日志接受的根证书。
"pre_certificate"是提交用于审计的预证书。
"precertificate_chain"是验证预证书提交所需的附加证书链。第一个证书可以(MAY)是有效的预证书签名证书,并且必须(MUST)认证第一个证书。后续每个证书必须(MUST)直接认证前一个证书。最终证书必须(MUST)是日志接受的根证书。