目录
以前的我一直很少在意扩展项这部分(除了证书扩展外),但是后来接触的TLS/SSL协议越多,发现扩展项很多地方都出现,而且挺重要的,如证书链结构里的CRL分发点,用来标识一个URL地址,提供下载证书吊销列表来做证书吊销校验。在CRL结构中也有扩展项,如CRL Number扩展,颁发机构标识符扩展等。同样是提供证书吊销状态校验的OCSP服务也是提供有可选的扩展项,例如Nonce随机数扩展,发送OCSP校验的一方在请求中放置一个随机数,来标识每一次请求都是唯一的。在LTS握手协议里面的Client Hello和Server Hello子消息中也有不少可选的扩展项,作用也很重要,客户端和服务器端之间的扩展项也有一定的联系,所以这篇日志就把Client Hello和Server Hello的扩展项总结一下,扩展项最显著的一个特点就是可以让客户端和服务器端在不更新TLS协议版本的基础上使用更多的其他功能。
TLS/SSL协议扩展
在TLS握手层协议中提供了可选的扩展项,扩展结构由扩展类型的具体的扩展数据两部分组成:
//扩展项结构
struct {
ExtensionType extension_type;
opaque extension_data<0..2^16-1>;
} Extension;
扩展类型ExtensionType是一个枚举类型:
//扩展类型
enum {
server_name(0), //服务器名称
max_fragment_length(1), //最大fragment长度协商
client_certificate_url(2), //客户端证书URL
trusted_ca_keys(3),
truncated_hmac(4), //截断的HMAC
status_request(5), (65535) //支持的证书状态请求
supported_groups(10),
ec_point_formats(11),
signature_algorithms(13), //支持的签名算法和摘要算法
application_layer_protocol_negotiation(16), //支持的应用层协议
signed_certificate_timestamp(18), //支持证书透明度机制
extened_master_secret(23), //扩展的主密钥
SessionTicketTLS(35), //支持没有状态的会话恢复
renegotiation_info(65281), //支持安全的重协商
} ExtensionType;
里面列出了一些TLS握手层协议支持的扩展项,例如扩展支持证书吊销状态请求,扩展签名算法和摘要算法,扩展支持证书透明度机制等,可以说功能十分丰富(且都是前面接触过的),上图中括号里的数字表示的是扩展类型的编号,扩展类型占用两个字节的固定空间,扩展数据占用的空间则是可变的。在TLS握手层协议中,扩展的使用通常是先由客户端向服务器端发送扩展列表,里面是客户端支持的扩展项,扩展列表包含在Client Hello子消息中,服务器接收到自消息后