在看这篇文章前,最好先详细了解下openfire。
一、openfire连接协议的种类:
1、采用简单认证协议进行认证
2、采用旧的tls端口并且采用旧的tls协议连接。
3、采用STARTTLS协议进行连接。
二、SASL(简单认证和安全)
1、不使用STARTTLS协议
1) client --> server <stream:stream xmlns='jabber:client' to='superboy' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='admin@superboy' xml:lang='en'>
客户端发起stream连接
2) server --> client <stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="localhost" id="8yznvp8vxl" xml:lang="en" version="1.0">
服务端返回客户端一个标记
3) server --> client <stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism><mechanism>ANONYMOUS</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><ver xmlns="urn:xmpp:features:rosterver"/><register xmlns="http://jabber.org/features/iq-register"/></stream:features>
服务端向客户端返回服务端的一些特征:支持是xmpp-sasl协议(机制支持PLAIN,匿名登录),还支持压缩(zlib),还有支持内注册(jabber:iq:register)。特性官方文档(features)
4) client --> server <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AGFkbWluAHRlc3RrZXk=</auth>
客户端验证方式为PLAIN,并且返回服务端一个数据。
5) server --> client <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
服务端验证成功(登录成功,上次的数据里面包含了用户和密码)
6) client --> server <stream:stream xmlns='jabber:client' to='superboy' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='admin@superboy' id='8yznvp8vxl' xml:lang='en'>
客户端重新发起stream连接,携带了上次的id
7) server --> client <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="localhost" id="8yznvp8vxl" xml:lang="en" version="1.0"><stream:features><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><ver xmlns="urn:xmpp:features:rosterver"/><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"><optional/></session><sm xmlns='urn:xmpp:sm:2'/><sm xmlns='urn:xmpp:sm:3'/></stream:features>
服务端返回一些特性,比如数据压缩支持的方法,支持资源绑定<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>),支持IM session 建立(<session xmlns="urn:ietf:params:xml:ns:xmpp-session"><optional/></session>)和 支持流管理(<sm xmlns='urn:xmpp:sm:3'/>)。特性官方文档(features)
wireshark抓 包的效果图:
1、使用STARTTLS协议
1) client --> server <stream:stream xmlns='jabber:client' to='superboy' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='admin@superboy' xml:lang='en'>
客户端发起stream连接
2) server --> client <stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="localhost" id="8a9bheiskt" xml:lang="en" version="1.0">
服务端返回客户端一个标记
3) server --> client <stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism><mechanism>ANONYMOUS</mechanism></mechanisms></stream:features>
服务端向客户端返回服务端的一些特征:支持starttls协议并且是必须的,支持是xmpp-sasl协议(机制的支持PLAIN,匿名登录)。特性官方文档(features)
4) client --> server <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></starttls>
客户端请求服务器来xmpp的starttls协议。
5) server --> client <proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
服务端应答梳理xmpp-tls,随后开始。
发送Challenge报文:<challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cj0xb2VELnE4KlRdO34tVkltV2o0ckN8NjQ+Vn5DO2VpTmQ1NDRmYjIxLTcxOWEtNGQyYy05ZGJhLWE3MTFmODI5ODM2MCxzPWdrWjgycHdENlpLb1FYOWZzMnpWSEhodVA0NGxQWmRYLGk9NDA5Ng==</challenge>
6) client --> server <stream:stream xmlns='jabber:client' to='superboy' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='admin@superboy' xml:lang='en'>
客户端重新发起stream连接,这儿没有携带上次的id。
7) server --> client <stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="localhost" id="26trw7nj2u" xml:lang="en" version="1.0"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism><mechanism>ANONYMOUS</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><ver xmlns="urn:xmpp:features:rosterver"/><register xmlns="http://jabber.org/features/iq-register"/></stream:features>
服务端返回客户端一个标记并且服务端向客户端返回服务端的一些特征:支持是xmpp-sasl协议(机制支持PLAIN,匿名登录),还支持压缩(zlib),还有支持内注册(jabber:iq:register)。特性官方文档(features)
8) client --> server <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>AGFkbWluAHRlc3RrZXk=</auth>
client --> server 响应Challenge <response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>Yz1iaXdzLHI9MW9lRC5xOCpUXTt+LVZJbVdqNHJDfDY0PlZ+QztlaU5kNTQ0ZmIyMS03MTlhLTRkMmMtOWRiYS1hNzExZjgyOTgzNjAscD1PdWVzalMzOXVKM3h3YkI0T3JkeUxCN1NaRlU9</response>
客户端验证方式为PLAIN,并且返回服务端一个数据。
9) server --> client <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
服务端验证成功(登录成功,上次的数据里面包含了用户和密码)
10)client --> server <stream:stream xmlns='jabber:client' to='superboy' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='admin@superboy' id='26trw7nj2u' xml:lang='en'>
客户端重新发起stream连接,携带了上次的id
11)server --> client <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="localhost" id="26trw7nj2u" xml:lang="en" version="1.0"><stream:features><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><ver xmlns="urn:xmpp:features:rosterver"/><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"><optional/></session><sm xmlns='urn:xmpp:sm:2'/><sm xmlns='urn:xmpp:sm:3'/></stream:features>
服务端返回一些特性,比如数据压缩支持的方法,支持资源绑定<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/>),支持IM session 建立(<session xmlns="urn:ietf:params:xml:ns:xmpp-session"><optional/></session>)和 支持流管理(<sm xmlns='urn:xmpp:sm:3'/>)。特性官方文档(features)
wireshark抓 包的效果图:
总结:
两者的区别很明显,只是在starttls开始的时候多了starttls的部分,只有starttls成功才能执行sasl部分。
starttls可以从stream的发起作为分割点,可以分为三步,其中分为:
1> tls认证部分
2> sasl认证部分
3> 正式的数据
不过第3点我省略了讲解其中的资源绑定部分。
三、旧的tls端口连接
在使用旧的tls连接的时候内部数据是直接使用sasl协议,不支持starttls协议。
其中的tls是在tcp连接后直接作的tls认证,数据报的过程和不使用STARTTLS协议一样。
wireshark抓 包的效果图: