1. 程式人生 > >XMPP使用TLS和auth登入

XMPP使用TLS和auth登入

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握手成功