查看源代码 标准符合性

目的

本节描述了 ssl 应用程序当前的标准符合性状态。

通用(TLS 1.3 之前)

  • 出于安全原因,默认不再支持 RSA 密钥交换密码套件,但可以配置。(OTP 21)
  • 出于安全原因,默认不再支持 DES 密码套件,但可以配置。(OTP 20)
  • 出于安全原因,默认不再支持 3DES 密码套件,但可以配置。(OTP 21)
  • 支持重协商指示扩展 RFC 5746
  • 支持临时 Diffie-Hellman 密码套件,但不支持 Diffie Hellman 证书密码套件。
  • 如果 Crypto 应用程序支持且使用命名曲线,则支持椭圆曲线密码套件。
  • 由于美国在 2000 年初取消了出口限制,因此不支持出口密码套件。
  • 由于 IDEA 密码套件已被 TLS 1.2 规范弃用,因此没有动机实现它们,因此不支持它们。
  • 不支持压缩。
  • 可以使用预共享密钥 (PSK) 和安全远程密码 (SRP) 密码套件,但默认情况下它们未启用,需要额外配置。

通用

  • 支持 CRL 验证。
  • 支持策略证书扩展。(OTP 27)
  • 支持“服务器名称指示”扩展 (RFC 6066)。
  • 支持应用程序层协议协商 (ALPN) 及其后续的下一协议协商 (NPN)。

SSL 2.0

出于安全原因,不支持 SSL-2.0。与启用 SSL-2.0 的客户端的互操作性已放弃。(OTP 21)

SSL 3.0

出于安全原因,完全不再支持 SSL-3.0。(OTP 23)

出于安全原因,默认不再支持 SSL-3.0,但可以配置。(OTP 19)

TLS 1.0

出于安全原因,默认不再支持 TLS-1.0,但可以配置。(OTP 22)

TLS 1.1

出于安全原因,默认不再支持 TLS-1.1,但可以配置。(OTP 22)

TLS 1.2

支持

DTLS 1.0

出于安全原因,默认不再支持 DTLS-1.0(基于 TLS 1.1),但可以配置。(OTP 22)

DTLS 1.2

支持(基于 TLS 1.2)

DTLS 1.3

尚未支持

TLS 1.3

OTP-22 引入了对 TLS 1.3 的支持。当前的实现支持一组选定的加密算法

  • 密钥交换:默认支持 ECDHE 组
  • 组:所有标准组都支持 Diffie-Hellman 密钥交换
  • 组:支持来自 RFC 8734 的 brainpool 组
  • 密码:支持所有强制密码套件
  • 签名算法:RFC 8446 中的所有算法
  • 证书:RSA、ECDSA 和 EDDSA 密钥

其他值得注意的功能

  • 支持 PSK 和会话恢复(有状态和无状态票证)
  • 使用带有无状态票证的 Bloom 过滤器进行反重放保护
  • 支持早期数据和 0-RTT
  • 支持密钥和初始化向量更新

有关更多详细信息,请参阅下面的标准符合性

下表描述了 TLS 1.3 当前的标准符合性状态。

C = 符合,NC = 不符合,PC = 部分符合,NA = 不适用)

章节功能状态
1.3. 影响 TLS 1.2 的更新C24.1
版本降级保护机制C22
RSASSA-PSS 签名方案C24.1
supported_versions (ClientHello) 扩展C22
signature_algorithms_cert 扩展C24.1
2. 协议概述PC22
(EC)DHEC22
仅 PSKNC
带有 (EC)DHE 的 PSKC22.2
2.1. 不正确的 DHE 共享HelloRetryRequestC22
2.2. 恢复和预共享密钥 (PSK)C22.2
2.3. 0-RTT 数据PC23.3
4.1.1. 加密协商C22.2
supported_groups 扩展C22
signature_algorithms 扩展C22
pre_shared_key 扩展C22.2
4.1.2. 客户端 Hello客户端PC22.1
server_name (RFC6066)C23.2
max_fragment_length (RFC6066)C23.0
status_request (RFC6066)C27.0
supported_groups (RFC7919)C22.1
signature_algorithms (RFC8446)C22.1
use_srtp (RFC5764)C26.0
heartbeat (RFC6520)NC
application_layer_protocol_negotiation (RFC7301)C22.1
signed_certificate_timestamp (RFC6962)NC
client_certificate_type (RFC7250)NC
server_certificate_type (RFC7250)NC
padding (RFC7685)NC
key_share (RFC8446)C22.1
pre_shared_key (RFC8446)C22.2
psk_key_exchange_modes (RFC8446)C22.2
early_data (RFC8446)C23.3
cookie (RFC8446)C23.1
supported_versions (RFC8446)C22.1
certificate_authorities (RFC8446)C24.3
oid_filters (RFC8446)NC
post_handshake_auth (RFC8446)NC
signature_algorithms_cert (RFC8446)C22.1
服务器PC22
server_name (RFC6066)C23.2
max_fragment_length (RFC6066)C23.0
status_request (RFC6066)NC
supported_groups (RFC7919)C22
signature_algorithms (RFC8446)C22
use_srtp (RFC5764)C26.0
heartbeat (RFC6520)NC
application_layer_protocol_negotiation (RFC7301)C22.1
signed_certificate_timestamp (RFC6962)NC
client_certificate_type (RFC7250)NC
server_certificate_type (RFC7250)NC
padding (RFC7685)NC
key_share (RFC8446)C22
pre_shared_key (RFC8446)C22.2
psk_key_exchange_modes (RFC8446)C22.2
early_data (RFC8446)C23.3
cookie (RFC8446)C23.1
supported_versions (RFC8446)C22
oid_filters (RFC8446)NC
post_handshake_auth (RFC8446)NC
signature_algorithms_cert (RFC8446)C22
4.1.3. 服务器 Hello客户端C22.2
版本降级保护C22.1
key_share (RFC8446)C22.1
pre_shared_key (RFC8446)C22.2
supported_versions (RFC8446)C22.1
use_srtp (RFC5764)C26.0
服务器C22.2
版本降级保护C22
key_share (RFC8446)C22
pre_shared_key (RFC8446)C22.2
supported_versions (RFC8446)C22
use_srtp (RFC5764)C26.0
4.1.4. Hello 重试请求服务器C22
key_share (RFC8446)C22
cookie (RFC8446)C23.1
supported_versions (RFC8446)C22
4.2.1. 支持的版本客户端C22.1
服务器C22
4.2.2. Cookie客户端C23.1
服务器C23.1
4.2.3. 签名算法客户端C24
rsa_pkcs1_sha256C22.1
rsa_pkcs1_sha384C22.1
rsa_pkcs1_sha512C22.1
ecdsa_secp256r1_sha256C22.1
ecdsa_secp384r1_sha384C22.1
ecdsa_secp521r1_sha512C22.1
rsa_pss_rsae_sha256C22.1
rsa_pss_rsae_sha384C22.1
rsa_pss_rsae_sha512C22.1
ed25519C24
ed448C24
rsa_pss_pss_sha256C23
rsa_pss_pss_sha384C23
rsa_pss_pss_sha512C23
rsa_pkcs1_sha1C22.1
ecdsa_sha1C22.1
服务器C24
rsa_pkcs1_sha256C22
rsa_pkcs1_sha384C22
rsa_pkcs1_sha512C22
ecdsa_secp256r1_sha256C22.1
ecdsa_secp384r1_sha384C22.1
ecdsa_secp521r1_sha512C22.1
rsa_pss_rsae_sha256C22
rsa_pss_rsae_sha384C22
rsa_pss_rsae_sha512C22
ed25519C24
ed448C24
rsa_pss_pss_sha256C23
rsa_pss_pss_sha384C23
rsa_pss_pss_sha512C23
rsa_pkcs1_sha1C22
ecdsa_sha1C22
4.2.4. 证书颁发机构客户端C24.3
服务器C24.3
4.2.5. OID 过滤器客户端NC
服务器NC
4.2.6. 后握手客户端身份验证客户端NC
服务器NC
4.2.7. 支持的组客户端C22.1
secp256r1C22.1
secp384r1C22.1
secp521r1C22.1
x25519C22.1
x448C22.1
ffdhe2048C22.1
ffdhe3072C22.1
ffdhe4096C22.1
ffdhe6144C22.1
ffdhe8192C22.1
服务器C22
secp256r1C22
secp384r1C22
secp521r1C22
x25519C22
x448C22
ffdhe2048C22
ffdhe3072C22
ffdhe4096C22
ffdhe6144C22
ffdhe8192C22
4.2.8. 密钥共享客户端C22.1
服务器C22
4.2.9. 预共享密钥交换模式客户端C22.2
服务器C22.2
4.2.10. 早期数据指示客户端C23.3
服务器C23.3
4.2.11. 预共享密钥扩展客户端C22.2
服务器C22.2
4.2.11.1. 票证年龄客户端C22.2
服务器C22.2
4.2.11.2. PSK 绑定器客户端C22.2
服务器C22.2
4.2.11.3. 处理顺序客户端NC
服务器NC
4.3.1. 加密扩展客户端PC22.1
server_name (RFC6066)C23.2
max_fragment_length (RFC6066)C23.0
supported_groups (RFC7919)NC
use_srtp (RFC5764)NC
heartbeat (RFC6520)NC
application_layer_protocol_negotiation (RFC7301)C23.0
client_certificate_type (RFC7250)NC
server_certificate_type (RFC7250)NC
early_data (RFC8446)C23.3
服务器PC22
server_name (RFC6066)C23.2
max_fragment_length (RFC6066)C23.0
supported_groups (RFC7919)NC
use_srtp (RFC5764)NC
heartbeat (RFC6520)NC
application_layer_protocol_negotiation (RFC7301)C23.0
client_certificate_type (RFC7250)NC
server_certificate_type (RFC7250)NC
early_data (RFC8446)C23.3
4.3.2. 证书请求客户端PC22.1
status_request (RFC6066)NC
signature_algorithms (RFC8446)C22.1
signed_certificate_timestamp (RFC6962)NC
certificate_authorities (RFC8446)C24.3
oid_filters (RFC8446)NC
signature_algorithms_cert (RFC8446)C22.1
服务器PC22
status_request (RFC6066)NC
signature_algorithms (RFC8446)C22
signed_certificate_timestamp (RFC6962)NC
certificate_authorities (RFC8446)C24.3
oid_filters (RFC8446)NC
signature_algorithms_cert (RFC8446)C22
4.4.1. 抄本哈希C22
4.4.2. 证书客户端PC22.1
任意证书链排序C22.2
链中的无关证书C23.2
status_request (RFC6066)C27.0
signed_certificate_timestamp (RFC6962)NC
服务器PC22
status_request (RFC6066)NC
signed_certificate_timestamp (RFC6962)NC
4.4.2.1. OCSP 状态和 SCT 扩展客户端PC27.0
服务器NC
4.4.2.2. 服务器证书选择C24.3
除非明确协商另有约定,否则证书类型必须为 X.509v3C22
服务器的最终实体证书的公钥(以及相关的限制)必须与客户端的“signature_algorithms”扩展中选择的身份验证算法(当前为 RSA、ECDSA 或 EdDSA)兼容。C22
证书必须允许将密钥用于使用客户端“signature_algorithms”/“signature_algorithms_cert”扩展中指示的签名方案进行签名C22
“server_name”和“certificate_authorities”扩展用于指导证书选择。由于服务器 MAY 要求存在“server_name”扩展,因此客户端在适用时应发送此扩展。C24.3
4.4.2.3. 客户端证书选择PC22.1
除非明确协商另有约定,否则证书类型必须为 X.509v3C22.1
如果 CertificateRequest 消息中存在“certificate_authorities”扩展,则证书链中的至少一个证书应由列出的 CA 颁发。C24.3
证书必须使用可接受的签名算法进行签名C22.1
如果 CertificateRequest 消息包含非空的“oid_filters”扩展,则最终实体证书必须与客户端识别的扩展 OID 匹配NC
4.4.2.4. 接收证书消息客户端C22.1
服务器C22
4.4.3. 证书验证客户端C22.1
服务器C22
4.4.4. 完成客户端C22.1
服务器C22
4.5. 早期数据结束客户端C23.3
服务器C23.3
4.6.1. 新会话票证消息客户端C23.3
early_data (RFC8446)C23.3
服务器C23.3
early_data (RFC8446)C23.3
4.6.2. 后握手身份验证客户端NC
服务器NC
4.6.3. 密钥和初始化向量更新客户端C22.3
服务器C22.3
5.1. 记录层C22
不得与其他记录类型交错C22
不得跨越密钥更改C22
不得发送零长度片段C22
警报消息不得分段C22
5.2. 记录有效负载保护C22
5.3. 每个记录的随机数C22
5.4. 记录填充PC22
可以选择填充NC
不得发送 TLSInnerPlaintext.content 为零长度的握手和警报记录NC
发送的填充会自动验证C22
5.5. 密钥使用限制C22.3
6.1. 关闭警报22
close_notifyC22
user_cancelledC22
6.2. 错误警报PC22
7.1. 密钥调度C22
7.2. 更新流量密钥C22
7.3. 流量密钥计算C22
7.5. 导出器PC26.3
8. 0-RTT 和反重放C22.2
8.1. 一次性票证C22.2
8.2. 客户端 Hello 记录C22.2
8.3. 新鲜度检查C22.2
9.1. 强制实施密码套件C22.1
必须实现 TLS_AES_128_GCM_SHA256C22
应该实现 TLS_AES_256_GCM_SHA384C22
应该实现 TLS_CHACHA20_POLY1305_SHA256C22
数字签名C22.1
必须支持 rsa_pkcs1_sha256(用于证书)C22
必须支持 rsa_pss_rsae_sha256(用于 CertificateVerify 和证书)C22
必须支持 ecdsa_secp256r1_sha256C22.1
密钥交换C22
必须支持与 secp256r1 的密钥交换C22
应该支持与 X25519 的密钥交换C22
9.2. 强制实施扩展C23.2
支持的版本C22
CookieC23.1
签名算法C22
签名算法证书C22
协商组C22
密钥共享C22
服务器名称指示C23.2
必须发送并使用这些扩展C22.2
"supported_versions" 对于 ClientHello、ServerHello 和 HelloRetryRequest 是必需的C22.1
"signature_algorithms" 对于证书认证是必需的C22
"supported_groups" 对于使用 (EC)DHE 密钥交换的 ClientHello 消息是必需的C22
"key_share" 对于 (EC)DHE 密钥交换是必需的C22
"pre_shared_key" 对于 PSK 密钥协商是必需的C22.2
"psk_key_exchange_modes" 对于 PSK 密钥协商是必需的C22.2
TLS 1.3 ClientHelloC22.1
如果未包含 "pre_shared_key" 扩展,则必须同时包含 "signature_algorithms" 扩展和 "supported_groups" 扩展。C22.1
如果包含 "supported_groups" 扩展,则还必须包含 "key_share" 扩展,反之亦然。允许使用空的 KeyShare.client_shares 向量。C22.1
TLS 1.3 ServerHelloC23.2
必须支持使用 "server_name" 扩展C23.2
9.3. 协议不变性C22.1
必须正确处理可扩展字段C22.1
发送 ClientHello 的客户端必须支持其中声明的所有参数。否则,服务器可能会因选择其中一个参数而无法互操作。C22.1
接收 ClientHello 的服务器必须正确忽略所有无法识别的密码套件、扩展和其他参数。否则,它可能无法与较新的客户端互操作。在 TLS 1.3 中,接收 CertificateRequest 或 NewSessionTicket 的客户端也必须忽略所有无法识别的扩展。C22.1
终止 TLS 连接的中间盒必须表现为符合规范的 TLS 服务器不适用
转发其不理解的 ClientHello 参数的中间盒不得处理该 ClientHello 之外的任何消息。它必须原样转发所有后续流量。否则,它可能无法与较新的客户端和服务器互操作。不适用
B.4. 密码套件C23
TLS_AES_128_GCM_SHA256C22
TLS_AES_256_GCM_SHA384C22
TLS_CHACHA20_POLY1305_SHA256C22
TLS_AES_128_CCM_SHA256C22
TLS_AES_128_CCM_8_SHA256C23
C.1. 随机数生成和种子C22
C.2. 证书和认证C22
C.3. 实现陷阱PC22
C.4. 客户端跟踪预防C22.2
C.5. 未认证操作C22
D.1. 与旧服务器协商C22.2
D.2. 与旧客户端协商C22
D.3. 0-RTT 向后兼容性NC
D.4. 中间盒兼容模式C23
D.5. 与向后兼容性相关的安全限制C22

表:标准合规性