4. 使用TLS
XMPP通过使用TLS来确保stream不被篡改和偷听。其模型是IAMP,POP3安全机制的扩展。其namespace必须使用:urn:ietf:params:xml:ns:xmpp-tls。
TLS:Transport Layer Security protocol
4.1概述
Rules:
-1〉发起方若遵照规范,则必须包含version,且version=1.0
-2〉如果TLS协商发生在server之间,不应处理communication,直到server报告dns主机可用。
-3〉receive 侧在reply后,必须包含
-4〉若发起方选择使用TLS,那么TLS协商必须在SASL协商前完成。有效保证SASL鉴定信息的安全。
-5〉TLS协商期间,entity决不能发送white space字符。
-6〉接收方在发送
-7〉发起方必须验证就收侧提供的证书的有效性,见Certificate Validation。
-8〉证书的验证必须参照发起方提供的hostname,而不是dns。JID在证书中必须为UTF8string,subjectAltName内的其他实体名称采用ASN.1对象Id标示:id-on-xmppAddr。
-9〉如果TLS协商成功,receive侧必须在TLS生效前,抛弃所有来自Initiating侧的非安全的方式。
-10〉如果TLS协商成功,Initiating侧必须在TLS生效前,抛弃所有来自receive侧的非安全的方式。
-11〉如果TLS协商成功,receive实体将不能再在stream开始时使用STARTTLS。
-12〉如果TLS协商成功,Initiating实体必须继续SASL协商。
-13〉如果TLS协商失败,receive实体必须停止stream和潜在的tcp连接。
-14〉一些强制执行的机制必须支持:Mandatory-to-Implement Technologies。
ASN.1
(显然这里的ASN.1是采用xml表示,因此编解码都依赖于xml)
对象Id表示方法之一;
也可以用dotted格式,即打点的方法;
4.2 描述
Initiating实体使用TLS保证stream安全的步骤如下:
-1〉initiate实体开一个tcp连接,发送opening xml stream head,携带version,并设定为最新1.0
-2〉receive实体由tcp通过发送XML stream header回复initiate一个response,head中携带version最新为1.0。
-3〉receive实体在支持的feather中提供starttls给initiate实体;(如果receive交互需要tls,那么starttls必须包含子项
-4〉initiate实体发送一个starttls指令到receive实体,使用名字空间urn:ietf:params:xml:ns:xmpp-tls',表示希望发起一个TLS协商来secure该stream。
-5〉receive实体必须使用名字空间urn:ietf:params:xml:ns:xmpp-tls
回复
-6〉initiate和receive方尝试完成的TLS协商,都与TLS一致;通过同一个binding的tcp;
-7〉如果TLS协商失败,receive关闭tcp。如果成功initiate必须发送新的open stream(不需要发送因两侧认为初始stream是关闭状态);
-8〉一旦收到initiate的消息,receive实体应立即通过新的stream回复response并协同相关支持的feather,但不应包含starttls。