XMPP使用TLS和auth登录

来源:互联网 发布:java员工薪资管理 编辑:程序博客网 时间:2024/05/17 08:50
XMPP

SASL(Simple Authentication and Security Layer)

TLS(Transport Layer Security)

TCP

IP


110客户端 spark2.6.3
116服务端 openfire3.9.1


一、登录

1. 110->116 <stream:stream xmlns:stream="http://etherx.jabber.org/streams" 
                           xmlns="jabber:client" 
                           to="192.168.20.116" 
                           version="1.0" > 

2. 116->110 <stream:stream 
                           xmlns:stream="http://etherx.jabber.org/streams" 
                           xmlns="jabber:client" 
                           from="hiterminalsvn" 
                           id="c41f9b17" 
                           xml:lang="en" 
                           version="1.0"> 
3. 116->110 <stream:features>
                            <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls>                //如果服务端开启了TLS才会有此项
                            <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">                  //验证机制
                                  <mechanism>DIGEST-MD5</mechanism>
                                  <mechanism>PLAIN</mechanism>
                                  <mechanism>ANONYMOUS</mechanism>
                                  <mechanism>CRAM-MD5</mechanism>
                            </mechanisms>
                            <compression xmlns="http://jabber.org/features/compress">
                                 <method>zlib</method>
                            </compression>
                            <auth xmlns="http://jabber.org/features/iq-auth"/>
                            <register xmlns="http://jabber.org/features/iq-register"/>
                       </stream:features>
 
4. 110->116 <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls" />                                     //3中有starttls才会有4和5,TLS协商
5. 116->110 <proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>                                   //tls握手成功,server通知client可继续运行,之后的数据均已加密(openfire默认是开启TLS的,如果想看到后面的包,可以在openfire控制台 -> Server -> Server Settings -> Security Settings -> Client Connection  Settings里的Custom -> TLS method选择Not Available)。

说明:
a. DIGEST-MD5:如果帐号和密码都在Client对象中提供了,这种机制是首选,即使没有TLS加密也是安全的。
b. PLAIN:如果DIGEST-MD5无效,就使用此种机制。在没有TLS加密时是不安全的。
c. ANONYMOUS:此种机制在没有提供帐号和密码时使用。服务器将随机产生临时帐号和资源,提供限制的有效服务。
d. EXTERNAL:此种机制目前只对客户端提供了证书和保密关键字(private key)而有效,服务器试图通过外部计算出客户端。举例来说,使用提供的证书或IP地址。

6(加密). 5成功的话,客户端初始化一个新stream给服务端 
110->116 <stream:stream 
                       xmlns:stream="http://etherx.jabber.org/streams" 
                       xmlns="jabber:client" 
                       to="192.168.20.116" 
                       version="1.0" >
7(加密). 116->110 <stream:stream 
                                      xmlns:stream="http://etherx.jabber.org/streams" 
                                      xmlns="jabber:client" 
                                      from="hiterminalsvn" 
                                      id="c41f9b17" 
                                      xml:lang="en" 
                                      version="1.0" >
                                 <stream:features 
                                      xmlns:stream="http://etherx.jabber.org/streams">
                                      <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
                                            <mechanism>DIGEST-MD5</mechanism>
                                            <mechanism>PLAIN</mechanism>
                                            <mechanism>ANONYMOUS</mechanism>
                                            <mechanism>CRAM-MD5</mechanism>
                                       </mechanisms>
                                  <compression xmlns="http://jabber.org/features/compress">
                                       <method>zlib</method>
                                  </compression>
                                 <auth xmlns="http://jabber.org/features/iq-auth" />
                                 <register xmlns="http://jabber.org/features/iq-register" />
                             </stream:features>
8(加密). 110->116 <auth mechanism="PLAIN" xmlns="urn:ietf:params:xml:ns:xmpp-sasl">AGNpY2lvZmZpY2UAMTIz</auth>       //客户端选择一个验证机制,这里选的是PLAIN
9(加密). 116->110 <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl" /> SASL握手成功


如果选择DIGEST-MD5验证机制,8、9项会由以下4项代替
 
8. 110->116 <auth mechanism="DIGEST-MD5" xmlns="urn:ietf:params:xml:ns:xmpp-sasl" />           //客户端选择digest-md5认证
9. 116->110 <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09ImhpdGVybWluYWxzdm4iLG5vbmNlPSJ6V0tZRzgzSDlFNXJBaVE1THpMUVB4WmxFbFFaSDE3ZXVBb0xWbk1yIixxb3A9ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNz</challenge>                //服务器发送一个[BASE64]编码的challenge给客户端
10. 110->116 <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">dXNlcm5hbWU9ImNpY2lvZmZpY2UiLHJlYWxtPSJoaXRlcm1pbmFsc3ZuIixub25jZT0ieldLWUc4M0g5RTVyQWlRNUx6TFFQeFpsRWxRWkgxN2V1QW9MVm5NciIsY25vbmNlPSJhMWEwZjFhODYxZmFlN2YxMWI3NjU0MTA3MDg4M2EzNDE3ZTExOWNiNmY3OTI2NzdjNjRiOTVjNGZkY2ZiZDQzIixuYz0wMDAwMDAwMSxxb3A9YXV0aCxkaWdlc3QtdXJpPSJ4bXBwLzE5Mi4xNjguMjAuMTE2IixjaGFyc2V0PXV0Zi04LHJlc3BvbnNlPTBmODg1YWM4MzdkMjA3YzEzMmUyMmFmODEzOWM1ZGEw</response>
11. 116->110 <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cnNwYXV0aD1jZmM1MzVkOTdiNzY0MDhhNmY0Y2Y3NGM3MmFkZTg5NA==</success>
11(alt). 失败的话返回failure并关闭stream
116->110 <failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
                       <not-authorized />
                  </failure>

0 0
原创粉丝点击