1.使用规则
1.一个遵守本协议的初始化实体必须声明的version 是1.0
2.如果TLS握手发生在两个服务器之间,除非服务器声称的DNS主机名已经被解析,通信不能继续进行。
3.当一个遵守本协议的接收实体接收了一个初始化流(它的头信息中包含一个'version'属性并且值设为“1.0”),在发送应答流的的头信息(其中包含版本标记)之后,它必须发送<starttls/>元素(名字空间为 'urn:ietf:params:xml:ns:xmpp-tls')以及其他它支持的流特性。
4.如果初始化实体选择使用TLS,TLS握手必须在SASL握手之前完成(保证发送的SASL认证消息的安全)。
5.在握手期间,不能使用空格符作为元素的分隔符。
6.证书必须检查初始化实体(比如一个用户)提供的主机名;而不是通过DNS系统解析出来的主机名
7. 如果 TLS 握手成功了,接收实体必须 丢弃TLS 生效之前从初始化实体得到的任何不可靠的信息.
如果 TLS 握手成功了,初始化实体必须 丢弃TLS 生效之前从接收实体得到的任何不可靠的信息.
如果 TLS 握手成功了,接收实体不能在流重新开始的时候通过提供其他的流特性来向初始化实体提供
STARTTLS 扩展.
如果 TLS 握手成功了,初始化实体必须继续进行SASL握手。
如果 TLS 握手失败了,接收实体必须终止XML流和相应的TCP连接。
TLS具体示例:
客户端--服务器
客户端初始化流给服务端
<stream:stream
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
to='example.com'
version='1.0'>
服务端应答
<stream:stream
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
id='c2s_123'
from='example.com'
version='1.0'>
服务端 发送starttls 的范围
<stream:features>
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>
<required/>
</starttls>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
</mechanisms>
</stream:features>
客户端发送starttls命令
<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
此处有两种可能
1.服务器返回可以继续进行
<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
2.服务器返回牵手失败,关闭流和TCP链接
<failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
</stream:stream>
继续
客户端和服务端尝试通过已有的TCP链接完成TLS握手
此处有两种可能
1.握手成功客户端发送一个新的初始化流(放弃之前的不安全信息)
<stream:stream
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
to='example.com'
version='1.0'>
2.握手失败 服务端关闭流和TCP连接
继续
服务端应答并带有剩余的 SASL特性(TLS已经实现)
<stream:stream
xmlns='jabber:client'
xmlns:stream='http://etherx.jabber.org/streams'
from='example.com'
id='c2s_234'
version='1.0'>
<stream:features>
<mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
<mechanism>DIGEST-MD5</mechanism>
<mechanism>PLAIN</mechanism>
<mechanism>EXTERNAL</mechanism>
</mechanisms>
</stream:features>
TLS实例
服务器--服务器
与客户端--服务器相似