PSK (预共享密钥,Pre-Shared Key)
定义
PSK(预共享密钥)是 TLS 双方在握手前就已共同持有的秘密,用于会话恢复,或在不使用证书的情况下完成身份认证。
预共享密钥有两种来源。外部 PSK 通过带外方式预先配置,常见于无法处理证书的物联网和资源受限设备,TLS 1.2 为此提供了 TLS_PSK_WITH_AES_128_GCM_SHA256 等专用套件。恢复 PSK 则来自之前的连接:在 TLS 1.3 中,服务器发送 NewSessionTicket,这张票据就成为客户端下次可以出示的 PSK 标识。TLS 1.3 用同一个 pre_shared_key 扩展处理这两种情况,其中的 binder 值用来证明客户端确实知道这个密钥。
为什么重要
使用 PSK 恢复会话可以省掉证书传输、证书链验证和签名运算,速度更快,0-RTT 早期数据也建立在它之上。安全取舍由 psk_key_exchange_modes 扩展决定:psk_ke 只用 PSK,不具备前向保密;psk_dhe_ke 会额外做一次新的 (EC)DHE 交换,浏览器通常只提供 psk_dhe_ke。国内物联网平台的设备接入有时也采用 PSK 方式,这时密钥的生成和保管尤其关键。
例子
TLS 1.3 会话恢复时 ClientHello 中的相关字段,以及用 OpenSSL 快速测试会话恢复:
psk_key_exchange_modes: psk_dhe_ke
key_share: x25519 (...)
early_data (only when sending 0-RTT data)
pre_shared_key: identity = <ticket>, binder = <HMAC over the ClientHello>
openssl s_client -connect example.com:443 -sess_out session.pem
openssl s_client -connect example.com:443 -sess_in session.pem
服务器接受 PSK 时,第二次运行的输出中会显示 Reused。
常见误区
- PSK 连接没有前向保密。 只有 psk_ke 模式没有,psk_dhe_ke 会把 PSK 与临时密钥交换结合起来。
- PSK 就是一个密码。 外部 PSK 必须是高熵的随机密钥,低熵的口令可以被攻击者拿录下的握手离线猜解。
- TLS 1.3 中会话票据和 PSK 是两套机制。 TLS 1.3 的会话票据就是恢复 PSK 的标识。