zoukankan      html  css  js  c++  java
  • XMPP使用tls 和sasl登录

    转自:http://ycool.com/post/xc98m5k

    名词解释

    TLS:安全传输层协议 TLS:Transport Layer Security
    名词:
    安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。

    SASL全称Simple Authentication and Security Layer,是一种用来扩充C/S模式验证能力的机制。在Postfix可以利用SASL来判断用户是否有权使用转发服务,或是辨认谁在使用你的服务器。

    -----------------------------------------------------------------

    XMPP使用tls和sasl登录

    步骤 1:客户端初始化流给服务器:

    <stream:stream

    xmlns='jabber:client'

    xmlns:stream='http://etherx.jabber.org/streams'

    to='example.com'

    version='1.0'>

    步骤 2:服务器向客户端发送流标签作为应答:

    <stream:stream

    xmlns='jabber:client'

    xmlns:stream='http://etherx.jabber.org/streams'

    id='c2s_234'

    from='example.com'

    version='1.0'>

    步骤 3:服务器发送 STARTTLS范围给客户端(包括验证机制和任何其他流特性):

    <stream:features>

    <starttls xmlns="urn:ietf:params:xml:ns: xmpp-tls"></starttls>

    <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">

    <mechanism>PLAIN</mechanism>

    <mechanism>CRAM-MD5</mechanism>

    <mechanism>ANONYMOUS</mechanism>

    <mechanism>DIGEST-MD5</mechanism>

    <mechanism>JIVE-SHAREDSECRET</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>

    说明:

    1、 DIGEST-MD5:如果帐号和密码都在Client对象中提供了,这种机制是首选,即使没有TLS加密也是安全的。

    2、 PLAIN:如果DIGEST-MD5无效,就使用此种机制。在没有TLS加密时是不安全的。

    3、 ANONYMOUS:此种机制在没有提供帐号和密码时使用。服务器将随机产生临时帐号和资源,提供限制的有效服务。

    4、 EXTERNAL:此种机制目前只对客户端提供了证书和保密关键字(private key)而有效,服务器试图通过外部计算出客户端。举例来说,使用提供的证书或IP地址

    步骤 4:客户端发送 STARTTLS命令给服务器:

    <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

    步骤 5:服务器通知客户端可以继续进行:

    <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>

    Tls握手完成,进行SASL握手

    步骤 6: TLS握手成功,客户端初始化一个新的流给服务器:

    <stream:stream

    xmlns='jabber:client'

    xmlns:stream='http://etherx.jabber.org/streams'

    to='example.com'

    version='1.0'>

    步骤 7:服务器通知客户端可用的验证机制:

    <?xml version='1.0' encoding='UTF-8'?>

    <stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="f3563766f3e3424" id="8af4a783" xml:lang="en" version="1.0">

    <stream:features>

    <mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">

    <mechanism>PLAIN</mechanism>

    <mechanism>CRAM-MD5</mechanism>

    <mechanism>ANONYMOUS</mechanism>

    <mechanism>DIGEST-MD5</mechanism>

    <mechanism>JIVE-SHAREDSECRET</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:客户端选择一个验证机制:

    <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'/>

    步骤 9:服务器发送一个 [BASE64]编码的挑战给客户端:

    <challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>

    cmVhbG09InNvbWVyZWFsbSIsbm9uY2U9Ik9BNk1HOXRFUUdtMmhoIixxb3A9ImF1dGgi

    LGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNzCg==

    </challenge>

    解码后的挑战信息是:

    realm="somerealm",nonce="OA6MG9tEQGm2hh",

    qop="auth",charset=utf-8,algorithm=md5-sess

    步骤 10:客户端发送一个[BASE64]编码的回应这个挑战:

    <response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>

    dXNlcm5hbWU9InNvbWVub2RlIixyZWFsbT0ic29tZXJlYWxtIixub25jZT0i

    T0E2TUc5dEVRR20yaGgiLGNub25jZT0iT0E2TUhYaDZWcVRyUmsiLG5jPTAw

    MDAwMDAxLHFvcD1hdXRoLGRpZ2VzdC11cmk9InhtcHAvZXhhbXBsZS5jb20i

    LHJlc3BvbnNlPWQzODhkYWQ5MGQ0YmJkNzYwYTE1MjMyMWYyMTQzYWY3LGNo

    YXJzZXQ9dXRmLTgK

    </response>

    解码后的回应信息是:

    username="somenode",realm="somerealm",

    nonce="OA6MG9tEQGm2hh",cnonce="OA6MHXh6VqTrRk",

    nc=00000001,qop=auth,digest-uri="xmpp/example.com",

    response=d388dad90d4bbd760a152321f2143af7,charset=utf-8

    步骤 11:服务器发送另一个[BASE64]编码的挑战给客户端:

    <challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>

    cnNwYXV0aD1lYTQwZjYwMzM1YzQyN2I1NTI3Yjg0ZGJhYmNkZmZmZAo=

    </challenge>

    步骤 12:客户端应答这个挑战:

    <response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

    步骤 13:服务器通知客户端验证成功:

    <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>

  • 相关阅读:
    java.lang.NoSuchMethodError
    asm相关内容想下载(包括 jar 包)
    Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    交通测速方式
    卡口和电子警察的区别
    Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable
    在window上安装mysql
  • 原文地址:https://www.cnblogs.com/zbw911/p/3660604.html
Copyright © 2011-2022 走看看