3. Server Name Indication (服务器名称指示)
RFC 5246 没有提供 client 向 server 指明其正在联系哪个 server name 的机制. 对在同一底层网络地址托管多个 virtual server 的部署来说, client 提供该信息有助于 server 选择合适 certificate 和 security policy.
Client MAY 在 extended client hello 中包含 server_name extension. extension_data MUST 包含 ServerNameList:
struct {
NameType name_type;
select (name_type) {
case host_name: HostName;
} name;
} ServerName;
enum {
host_name(0), (255)
} NameType;
opaque HostName<1..2^16-1>;
struct {
ServerName server_name_list<1..2^16-1>
} ServerNameList;
ServerNameList MUST NOT 包含多于一个相同 name_type 的名称. 当前只支持 DNS hostname. HostName 是 client 理解的完整 DNS hostname, 使用 ASCII octet string 表示, 不带末尾点. IPv4 和 IPv6 literal address 不允许出现在 HostName 中.
如果 server 理解 ClientHello extension 但不识别 server name, server SHOULD 要么发送 fatal unrecognized_name(112) alert 终止 handshake, 要么继续 handshake. 不推荐发送 warning-level unrecognized_name, 因为 client 对 warning alert 的行为不可预测.
收到 server_name extension 的 server MAY 使用其中的信息选择 certificate 或其他安全策略. 若 server 使用该 extension, server MUST 在 extended server hello 中包含 server_name extension, 且 extension_data MUST 为空.
在 session resumption 中, server SHOULD 使用原 session 关联的 server name. 为确保 resumption request 中的 server name 与原始 handshake 一致, 实现 RECOMMENDED 在 session state 中保留 server name 信息.