查看源代码 标准符合性
目的
本节描述了 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 的更新 | C | 24.1 | |
版本降级保护机制 | C | 22 | |
RSASSA-PSS 签名方案 | C | 24.1 | |
supported_versions (ClientHello) 扩展 | C | 22 | |
signature_algorithms_cert 扩展 | C | 24.1 | |
2. 协议概述 | PC | 22 | |
(EC)DHE | C | 22 | |
仅 PSK | NC | ||
带有 (EC)DHE 的 PSK | C | 22.2 | |
2.1. 不正确的 DHE 共享 | HelloRetryRequest | C | 22 |
2.2. 恢复和预共享密钥 (PSK) | C | 22.2 | |
2.3. 0-RTT 数据 | PC | 23.3 | |
4.1.1. 加密协商 | C | 22.2 | |
supported_groups 扩展 | C | 22 | |
signature_algorithms 扩展 | C | 22 | |
pre_shared_key 扩展 | C | 22.2 | |
4.1.2. 客户端 Hello | 客户端 | PC | 22.1 |
server_name (RFC6066) | C | 23.2 | |
max_fragment_length (RFC6066) | C | 23.0 | |
status_request (RFC6066) | C | 27.0 | |
supported_groups (RFC7919) | C | 22.1 | |
signature_algorithms (RFC8446) | C | 22.1 | |
use_srtp (RFC5764) | C | 26.0 | |
heartbeat (RFC6520) | NC | ||
application_layer_protocol_negotiation (RFC7301) | C | 22.1 | |
signed_certificate_timestamp (RFC6962) | NC | ||
client_certificate_type (RFC7250) | NC | ||
server_certificate_type (RFC7250) | NC | ||
padding (RFC7685) | NC | ||
key_share (RFC8446) | C | 22.1 | |
pre_shared_key (RFC8446) | C | 22.2 | |
psk_key_exchange_modes (RFC8446) | C | 22.2 | |
early_data (RFC8446) | C | 23.3 | |
cookie (RFC8446) | C | 23.1 | |
supported_versions (RFC8446) | C | 22.1 | |
certificate_authorities (RFC8446) | C | 24.3 | |
oid_filters (RFC8446) | NC | ||
post_handshake_auth (RFC8446) | NC | ||
signature_algorithms_cert (RFC8446) | C | 22.1 | |
服务器 | PC | 22 | |
server_name (RFC6066) | C | 23.2 | |
max_fragment_length (RFC6066) | C | 23.0 | |
status_request (RFC6066) | NC | ||
supported_groups (RFC7919) | C | 22 | |
signature_algorithms (RFC8446) | C | 22 | |
use_srtp (RFC5764) | C | 26.0 | |
heartbeat (RFC6520) | NC | ||
application_layer_protocol_negotiation (RFC7301) | C | 22.1 | |
signed_certificate_timestamp (RFC6962) | NC | ||
client_certificate_type (RFC7250) | NC | ||
server_certificate_type (RFC7250) | NC | ||
padding (RFC7685) | NC | ||
key_share (RFC8446) | C | 22 | |
pre_shared_key (RFC8446) | C | 22.2 | |
psk_key_exchange_modes (RFC8446) | C | 22.2 | |
early_data (RFC8446) | C | 23.3 | |
cookie (RFC8446) | C | 23.1 | |
supported_versions (RFC8446) | C | 22 | |
oid_filters (RFC8446) | NC | ||
post_handshake_auth (RFC8446) | NC | ||
signature_algorithms_cert (RFC8446) | C | 22 | |
4.1.3. 服务器 Hello | 客户端 | C | 22.2 |
版本降级保护 | C | 22.1 | |
key_share (RFC8446) | C | 22.1 | |
pre_shared_key (RFC8446) | C | 22.2 | |
supported_versions (RFC8446) | C | 22.1 | |
use_srtp (RFC5764) | C | 26.0 | |
服务器 | C | 22.2 | |
版本降级保护 | C | 22 | |
key_share (RFC8446) | C | 22 | |
pre_shared_key (RFC8446) | C | 22.2 | |
supported_versions (RFC8446) | C | 22 | |
use_srtp (RFC5764) | C | 26.0 | |
4.1.4. Hello 重试请求 | 服务器 | C | 22 |
key_share (RFC8446) | C | 22 | |
cookie (RFC8446) | C | 23.1 | |
supported_versions (RFC8446) | C | 22 | |
4.2.1. 支持的版本 | 客户端 | C | 22.1 |
服务器 | C | 22 | |
4.2.2. Cookie | 客户端 | C | 23.1 |
服务器 | C | 23.1 | |
4.2.3. 签名算法 | 客户端 | C | 24 |
rsa_pkcs1_sha256 | C | 22.1 | |
rsa_pkcs1_sha384 | C | 22.1 | |
rsa_pkcs1_sha512 | C | 22.1 | |
ecdsa_secp256r1_sha256 | C | 22.1 | |
ecdsa_secp384r1_sha384 | C | 22.1 | |
ecdsa_secp521r1_sha512 | C | 22.1 | |
rsa_pss_rsae_sha256 | C | 22.1 | |
rsa_pss_rsae_sha384 | C | 22.1 | |
rsa_pss_rsae_sha512 | C | 22.1 | |
ed25519 | C | 24 | |
ed448 | C | 24 | |
rsa_pss_pss_sha256 | C | 23 | |
rsa_pss_pss_sha384 | C | 23 | |
rsa_pss_pss_sha512 | C | 23 | |
rsa_pkcs1_sha1 | C | 22.1 | |
ecdsa_sha1 | C | 22.1 | |
服务器 | C | 24 | |
rsa_pkcs1_sha256 | C | 22 | |
rsa_pkcs1_sha384 | C | 22 | |
rsa_pkcs1_sha512 | C | 22 | |
ecdsa_secp256r1_sha256 | C | 22.1 | |
ecdsa_secp384r1_sha384 | C | 22.1 | |
ecdsa_secp521r1_sha512 | C | 22.1 | |
rsa_pss_rsae_sha256 | C | 22 | |
rsa_pss_rsae_sha384 | C | 22 | |
rsa_pss_rsae_sha512 | C | 22 | |
ed25519 | C | 24 | |
ed448 | C | 24 | |
rsa_pss_pss_sha256 | C | 23 | |
rsa_pss_pss_sha384 | C | 23 | |
rsa_pss_pss_sha512 | C | 23 | |
rsa_pkcs1_sha1 | C | 22 | |
ecdsa_sha1 | C | 22 | |
4.2.4. 证书颁发机构 | 客户端 | C | 24.3 |
服务器 | C | 24.3 | |
4.2.5. OID 过滤器 | 客户端 | NC | |
服务器 | NC | ||
4.2.6. 后握手客户端身份验证 | 客户端 | NC | |
服务器 | NC | ||
4.2.7. 支持的组 | 客户端 | C | 22.1 |
secp256r1 | C | 22.1 | |
secp384r1 | C | 22.1 | |
secp521r1 | C | 22.1 | |
x25519 | C | 22.1 | |
x448 | C | 22.1 | |
ffdhe2048 | C | 22.1 | |
ffdhe3072 | C | 22.1 | |
ffdhe4096 | C | 22.1 | |
ffdhe6144 | C | 22.1 | |
ffdhe8192 | C | 22.1 | |
服务器 | C | 22 | |
secp256r1 | C | 22 | |
secp384r1 | C | 22 | |
secp521r1 | C | 22 | |
x25519 | C | 22 | |
x448 | C | 22 | |
ffdhe2048 | C | 22 | |
ffdhe3072 | C | 22 | |
ffdhe4096 | C | 22 | |
ffdhe6144 | C | 22 | |
ffdhe8192 | C | 22 | |
4.2.8. 密钥共享 | 客户端 | C | 22.1 |
服务器 | C | 22 | |
4.2.9. 预共享密钥交换模式 | 客户端 | C | 22.2 |
服务器 | C | 22.2 | |
4.2.10. 早期数据指示 | 客户端 | C | 23.3 |
服务器 | C | 23.3 | |
4.2.11. 预共享密钥扩展 | 客户端 | C | 22.2 |
服务器 | C | 22.2 | |
4.2.11.1. 票证年龄 | 客户端 | C | 22.2 |
服务器 | C | 22.2 | |
4.2.11.2. PSK 绑定器 | 客户端 | C | 22.2 |
服务器 | C | 22.2 | |
4.2.11.3. 处理顺序 | 客户端 | NC | |
服务器 | NC | ||
4.3.1. 加密扩展 | 客户端 | PC | 22.1 |
server_name (RFC6066) | C | 23.2 | |
max_fragment_length (RFC6066) | C | 23.0 | |
supported_groups (RFC7919) | NC | ||
use_srtp (RFC5764) | NC | ||
heartbeat (RFC6520) | NC | ||
application_layer_protocol_negotiation (RFC7301) | C | 23.0 | |
client_certificate_type (RFC7250) | NC | ||
server_certificate_type (RFC7250) | NC | ||
early_data (RFC8446) | C | 23.3 | |
服务器 | PC | 22 | |
server_name (RFC6066) | C | 23.2 | |
max_fragment_length (RFC6066) | C | 23.0 | |
supported_groups (RFC7919) | NC | ||
use_srtp (RFC5764) | NC | ||
heartbeat (RFC6520) | NC | ||
application_layer_protocol_negotiation (RFC7301) | C | 23.0 | |
client_certificate_type (RFC7250) | NC | ||
server_certificate_type (RFC7250) | NC | ||
early_data (RFC8446) | C | 23.3 | |
4.3.2. 证书请求 | 客户端 | PC | 22.1 |
status_request (RFC6066) | NC | ||
signature_algorithms (RFC8446) | C | 22.1 | |
signed_certificate_timestamp (RFC6962) | NC | ||
certificate_authorities (RFC8446) | C | 24.3 | |
oid_filters (RFC8446) | NC | ||
signature_algorithms_cert (RFC8446) | C | 22.1 | |
服务器 | PC | 22 | |
status_request (RFC6066) | NC | ||
signature_algorithms (RFC8446) | C | 22 | |
signed_certificate_timestamp (RFC6962) | NC | ||
certificate_authorities (RFC8446) | C | 24.3 | |
oid_filters (RFC8446) | NC | ||
signature_algorithms_cert (RFC8446) | C | 22 | |
4.4.1. 抄本哈希 | C | 22 | |
4.4.2. 证书 | 客户端 | PC | 22.1 |
任意证书链排序 | C | 22.2 | |
链中的无关证书 | C | 23.2 | |
status_request (RFC6066) | C | 27.0 | |
signed_certificate_timestamp (RFC6962) | NC | ||
服务器 | PC | 22 | |
status_request (RFC6066) | NC | ||
signed_certificate_timestamp (RFC6962) | NC | ||
4.4.2.1. OCSP 状态和 SCT 扩展 | 客户端 | PC | 27.0 |
服务器 | NC | ||
4.4.2.2. 服务器证书选择 | C | 24.3 | |
除非明确协商另有约定,否则证书类型必须为 X.509v3 | C | 22 | |
服务器的最终实体证书的公钥(以及相关的限制)必须与客户端的“signature_algorithms”扩展中选择的身份验证算法(当前为 RSA、ECDSA 或 EdDSA)兼容。 | C | 22 | |
证书必须允许将密钥用于使用客户端“signature_algorithms”/“signature_algorithms_cert”扩展中指示的签名方案进行签名 | C | 22 | |
“server_name”和“certificate_authorities”扩展用于指导证书选择。由于服务器 MAY 要求存在“server_name”扩展,因此客户端在适用时应发送此扩展。 | C | 24.3 | |
4.4.2.3. 客户端证书选择 | PC | 22.1 | |
除非明确协商另有约定,否则证书类型必须为 X.509v3 | C | 22.1 | |
如果 CertificateRequest 消息中存在“certificate_authorities”扩展,则证书链中的至少一个证书应由列出的 CA 颁发。 | C | 24.3 | |
证书必须使用可接受的签名算法进行签名 | C | 22.1 | |
如果 CertificateRequest 消息包含非空的“oid_filters”扩展,则最终实体证书必须与客户端识别的扩展 OID 匹配 | NC | ||
4.4.2.4. 接收证书消息 | 客户端 | C | 22.1 |
服务器 | C | 22 | |
4.4.3. 证书验证 | 客户端 | C | 22.1 |
服务器 | C | 22 | |
4.4.4. 完成 | 客户端 | C | 22.1 |
服务器 | C | 22 | |
4.5. 早期数据结束 | 客户端 | C | 23.3 |
服务器 | C | 23.3 | |
4.6.1. 新会话票证消息 | 客户端 | C | 23.3 |
early_data (RFC8446) | C | 23.3 | |
服务器 | C | 23.3 | |
early_data (RFC8446) | C | 23.3 | |
4.6.2. 后握手身份验证 | 客户端 | NC | |
服务器 | NC | ||
4.6.3. 密钥和初始化向量更新 | 客户端 | C | 22.3 |
服务器 | C | 22.3 | |
5.1. 记录层 | C | 22 | |
不得与其他记录类型交错 | C | 22 | |
不得跨越密钥更改 | C | 22 | |
不得发送零长度片段 | C | 22 | |
警报消息不得分段 | C | 22 | |
5.2. 记录有效负载保护 | C | 22 | |
5.3. 每个记录的随机数 | C | 22 | |
5.4. 记录填充 | PC | 22 | |
可以选择填充 | NC | ||
不得发送 TLSInnerPlaintext.content 为零长度的握手和警报记录 | NC | ||
发送的填充会自动验证 | C | 22 | |
5.5. 密钥使用限制 | C | 22.3 | |
6.1. 关闭警报 | 22 |
close_notify | C | 22 | ||
user_cancelled | C | 22 |
6.2. 错误警报 | PC | 22 | |
7.1. 密钥调度 | C | 22 | |
7.2. 更新流量密钥 | C | 22 | |
7.3. 流量密钥计算 | C | 22 | |
7.5. 导出器 | PC | 26.3 | |
8. 0-RTT 和反重放 | C | 22.2 | |
8.1. 一次性票证 | C | 22.2 | |
8.2. 客户端 Hello 记录 | C | 22.2 | |
8.3. 新鲜度检查 | C | 22.2 | |
9.1. 强制实施密码套件 | C | 22.1 | |
必须实现 TLS_AES_128_GCM_SHA256 | C | 22 | |
应该实现 TLS_AES_256_GCM_SHA384 | C | 22 | |
应该实现 TLS_CHACHA20_POLY1305_SHA256 | C | 22 | |
数字签名 | C | 22.1 | |
必须支持 rsa_pkcs1_sha256(用于证书) | C | 22 | |
必须支持 rsa_pss_rsae_sha256(用于 CertificateVerify 和证书) | C | 22 | |
必须支持 ecdsa_secp256r1_sha256 | C | 22.1 | |
密钥交换 | C | 22 | |
必须支持与 secp256r1 的密钥交换 | C | 22 | |
应该支持与 X25519 的密钥交换 | C | 22 | |
9.2. 强制实施扩展 | C | 23.2 | |
支持的版本 | C | 22 | |
Cookie | C | 23.1 | |
签名算法 | C | 22 | |
签名算法证书 | C | 22 | |
协商组 | C | 22 | |
密钥共享 | C | 22 | |
服务器名称指示 | C | 23.2 | |
必须发送并使用这些扩展 | C | 22.2 | |
"supported_versions" 对于 ClientHello、ServerHello 和 HelloRetryRequest 是必需的 | C | 22.1 | |
"signature_algorithms" 对于证书认证是必需的 | C | 22 | |
"supported_groups" 对于使用 (EC)DHE 密钥交换的 ClientHello 消息是必需的 | C | 22 | |
"key_share" 对于 (EC)DHE 密钥交换是必需的 | C | 22 | |
"pre_shared_key" 对于 PSK 密钥协商是必需的 | C | 22.2 | |
"psk_key_exchange_modes" 对于 PSK 密钥协商是必需的 | C | 22.2 | |
TLS 1.3 ClientHello | C | 22.1 | |
如果未包含 "pre_shared_key" 扩展,则必须同时包含 "signature_algorithms" 扩展和 "supported_groups" 扩展。 | C | 22.1 | |
如果包含 "supported_groups" 扩展,则还必须包含 "key_share" 扩展,反之亦然。允许使用空的 KeyShare.client_shares 向量。 | C | 22.1 | |
TLS 1.3 ServerHello | C | 23.2 | |
必须支持使用 "server_name" 扩展 | C | 23.2 | |
9.3. 协议不变性 | C | 22.1 | |
必须正确处理可扩展字段 | C | 22.1 | |
发送 ClientHello 的客户端必须支持其中声明的所有参数。否则,服务器可能会因选择其中一个参数而无法互操作。 | C | 22.1 | |
接收 ClientHello 的服务器必须正确忽略所有无法识别的密码套件、扩展和其他参数。否则,它可能无法与较新的客户端互操作。在 TLS 1.3 中,接收 CertificateRequest 或 NewSessionTicket 的客户端也必须忽略所有无法识别的扩展。 | C | 22.1 | |
终止 TLS 连接的中间盒必须表现为符合规范的 TLS 服务器 | 不适用 | ||
转发其不理解的 ClientHello 参数的中间盒不得处理该 ClientHello 之外的任何消息。它必须原样转发所有后续流量。否则,它可能无法与较新的客户端和服务器互操作。 | 不适用 | ||
B.4. 密码套件 | C | 23 | |
TLS_AES_128_GCM_SHA256 | C | 22 | |
TLS_AES_256_GCM_SHA384 | C | 22 | |
TLS_CHACHA20_POLY1305_SHA256 | C | 22 | |
TLS_AES_128_CCM_SHA256 | C | 22 | |
TLS_AES_128_CCM_8_SHA256 | C | 23 | |
C.1. 随机数生成和种子 | C | 22 | |
C.2. 证书和认证 | C | 22 | |
C.3. 实现陷阱 | PC | 22 | |
C.4. 客户端跟踪预防 | C | 22.2 | |
C.5. 未认证操作 | C | 22 | |
D.1. 与旧服务器协商 | C | 22.2 | |
D.2. 与旧客户端协商 | C | 22 | |
D.3. 0-RTT 向后兼容性 | NC | ||
D.4. 中间盒兼容模式 | C | 23 | |
D.5. 与向后兼容性相关的安全限制 | C | 22 |
表:标准合规性