跳到主要内容

3. TLS ALPN Challenge (结合 ALPN 的 TLS 质询)

3. TLS with Application-Layer Protocol Negotiation (TLS ALPN) Challenge (结合 ALPN 的 TLS 质询)

结合 Application-Layer Protocol Negotiation (应用层协议协商, ALPN) 的 TLS (TLS ALPN) 验证方法通过要求 ACME 客户端将 TLS 服务器配置为: 在特定连接尝试中使用带有标识信息的 ALPN 扩展进行响应, 来证明对域名的控制. ACME 服务器通过连接到为该域名解析得到的某一地址上的 TLS 服务器, 并验证所呈现的证书具有特定内容, 来验证对该域名的控制.

tls-alpn-01 ACME 质询对象具有如下格式:

type (必需, string (字符串)): 字符串 tls-alpn-01

token (必需, string (字符串)): 唯一标识该质询的随机值. 该值必须具有至少 128 比特的熵. 绝对不能包含 [RFC4648] 第 5 节所述 base64url 字母表之外的任何字符. 必须去除尾部的 = 填充字符. 关于随机性要求的更多信息见 [RFC4086].

客户端通过构造一张自签名证书来准备验证, 该证书必须包含 acmeIdentifier 扩展以及 subjectAlternativeName 扩展 [RFC5280]. subjectAlternativeName 扩展必须仅包含一个 dNSName 项, 其值为正在验证的域名. acmeIdentifier 扩展必须包含该质询的 key authorization (密钥授权) [RFC8555] 的 SHA-256 摘要 [FIPS180-4]. acmeIdentifier 扩展必须为 critical (关键), 以免证书被非 ACME 软件无意中使用.

acmeIdentifier 扩展由 id-pe 弧 [RFC5280] 中的 id-pe-acmeIdentifier 对象标识符 (OID) 标识:

id-pe-acmeIdentifier OBJECT IDENTIFIER ::=  { id-pe 31 }

该扩展具有以下 ASN.1 [X.680] 格式:

Authorization ::= OCTET STRING (SIZE (32))

id-pe-acmeIdentifier 扩展的 extnValueAuthorization 结构的 ASN.1 DER 编码 [X.690], 其中包含该质询的 key authorization 的 SHA-256 摘要.

证书一旦创建, 必须按如下方式部署: 在已协商应用层协议 acme-tls/1, 且已提供包含待验证域名的 Server Name Indication (服务器名称指示, SNI) 扩展 [RFC6066] 的 TLS 握手期间返回该证书.

客户端通过向质询 URL POST 一个空的 JSON 对象 ({}) 进行响应, 表示质询已可由服务器验证. 受保护标头与载荷的 base64url 编码见 [RFC8555] 第 6.1 节.

POST /acme/authz/1234/1
Host: example.com
Content-Type: application/jose+json

{
"protected": base64url({
"alg": "ES256",
"kid": "https://example.com/acme/acct/1",
"nonce": "JHb54aT_KTXBWQOzGYkt9A",
"url": "https://example.com/acme/authz/1234/1"
}),
"payload": base64url({}),
"signature": "Q1bURgJoEslbD1c5...3pYdSMLio57mQNN4"
}

服务器在收到客户端的该请求后, 根据质询的 token 值以及当前客户端账户密钥构造并存储 key authorization.

随后, 服务器通过以下步骤验证 TLS 服务器是否按预期配置, 以验证客户端对该域名的控制:

  1. ACME 服务器计算 key authorization 的预期 SHA-256 摘要.

  2. ACME 服务器解析待验证的域名, 并选择返回的某一 IP 地址进行验证 (若返回多个地址, 服务器可以针对多个地址进行验证).

  3. ACME 服务器向所选 IP 地址发起 TLS 连接. 该连接必须使用 TCP 443 端口. ACME 服务器必须在 TLS 握手中提供仅包含单个协议名 acme-tls/1 的 ALPN 扩展, 以及仅包含待验证域名的 SNI 扩展.

  4. ACME 服务器验证在 TLS 握手中是否成功协商了应用层协议 acme-tls/1 (且 ALPN 扩展仅包含值 acme-tls/1), 并且返回的证书包含:

    • 包含正在验证的 dNSName 且不包含其他项的 subjectAltName 扩展

    • 包含第 1 步计算所得预期 SHA-256 摘要的 critical acmeIdentifier 扩展

dNSName 的比较必须不区分大小写 [RFC4343]. 注意, 由于 ACME 不支持 Unicode 标识符, 所有 dNSName 必须按 [RFC3492] 的规则编码.

若以上各步均成功, 则验证成功. 否则验证失败.