代码之家  ›  专栏  ›  技术社区  ›  Elletlar FireTr3e

如何从命令行创建XMPP会话?

  •  1
  • Elletlar FireTr3e  · 技术社区  · 6 年前

    背景:我正在开发一个XMPP应用程序,它使用SMACK与ejabberd服务器进行对话。

    出于教育目的,我希望能够手动向服务器发出XMPP命令。

    我找到了一个打开的服务器列表,并选择了这个: https://xmpp.is/account/register/xmpp_is/

    我使用以下命令连接到它:

    openssl s_client -starttls xmpp -connect xmpp.is:5222
    

    为了找出对问题的响应,我阅读了RFC,但也安装了一个名为“Swift”的Windows XMPP应用程序,主要是因为它有一个控制台功能,可以显示客户端和服务器之间的流量: https://swift.im/

    虽然我能够从服务器获得一些响应,但我还不知道如何从命令行成功登录。

    成功登录的swift流量如下所示:

    <!-- OUT 2018-09-15T16:19:39 -->
    <?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="xmpp.is" version="1.0">
    <!-- IN 2018-09-15T16:19:40 -->
    <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' xml:lang='en' from='xmpp.is' id='2a12ed5d-b01d-44e9-a3c4-c083340f6e1a' version='1.0' xmlns='jabber:client'><stream:features><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'><required/></starttls></stream:features>
    <!-- OUT 2018-09-15T16:19:40 -->
    <starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
    <!-- IN 2018-09-15T16:19:40 -->
    <proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>
    <!-- OUT 2018-09-15T16:19:40 -->
    <?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="xmpp.is" version="1.0">
    <!-- IN 2018-09-15T16:19:40 -->
    <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' xml:lang='en' from='xmpp.is' id='3551ba66-c71e-4113-bd52-51d7ce9edf8e' version='1.0' xmlns='jabber:client'><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>SCRAM-SHA-1</mechanism><mechanism>SCRAM-SHA-1-PLUS</mechanism></mechanisms></stream:features>
    <!-- OUT 2018-09-15T16:19:40 -->
    <auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="SCRAM-SHA-1-PLUS">cD10bHMtdW5pcXVlLCxuPXNub28scj1kYjIxNzM5Mi0yZmJkLTQxMmMtYmM4Ny00Mzg2MWZjMzMxZTM=</auth>
    <!-- IN 2018-09-15T16:19:40 -->
    <challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>cj1kYjIxNzM5Mi0yZmJkLTQxMmMtYmM4Ny00Mzg2MWZjMzMxZTM1YzgxZDE1MC1iZmFhLTQwNjQtOWJhNi0wYWUwNzA3YzhmMDQscz1NR1ZsTVRoaFpqTXRZakpsTkMwMFlqSmtMV0V6Tm1FdFlURmhaR1JoWWpsa1pEZ3csaT00MDk2</challenge>
    <!-- OUT 2018-09-15T16:19:40 -->
    <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">Yz1jRDEwYkhNdGRXNXBjWFZsTEN3em1qc1FHRWtPeUduUjNNST0scj1kYjIxNzM5Mi0yZmJkLTQxMmMtYmM4Ny00Mzg2MWZjMzMxZTM1YzgxZDE1MC1iZmFhLTQwNjQtOWJhNi0wYWUwNzA3YzhmMDQscD1VaFNTbmlEblM3S2I3Sm9OYUVraTRIWEJYK2M9</response>
    <!-- IN 2018-09-15T16:19:40 -->
    <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>dj1Fa1ZuUGpmYU4wWTNyK0tsYWF1ViszOTVyMzg9</success>
    <!-- OUT 2018-09-15T16:19:40 -->
    <?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="xmpp.is" version="1.0">
    <!-- IN 2018-09-15T16:19:40 -->
    <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' xml:lang='en' from='xmpp.is' id='3b390a8b-e137-46b6-988d-b66208277e67' version='1.0' xmlns='jabber:client'><stream:features><csi xmlns='urn:xmpp:csi:0'/><sm xmlns='urn:xmpp:sm:2'><optional/></sm><sm xmlns='urn:xmpp:sm:3'><optional/></sm><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><required/></bind><session xmlns='urn:ietf:params:xml:ns:xmpp-session'><optional/></session><c hash='sha-1' ver='L89AHiFIV5exIjD3VCsiLb//JIg=' node='http://prosody.im' xmlns='http://jabber.org/protocol/caps'/><ver xmlns='urn:xmpp:features:rosterver'/></stream:features>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="session-bind" type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>10ce5033-4f48-4f70-8f88-8c8f2e0525f0</resource></bind></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='session-bind' type='result'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0</jid></bind></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <enable xmlns="urn:xmpp:sm:2"/>
    <!-- IN 2018-09-15T16:19:40 -->
    <enabled max='300' xmlns='urn:xmpp:sm:2'/>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="session-start" type="set"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='session-start' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0'/>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="e69a06ef-8f3b-4492-95cf-206b252363bf" type="get"><vCard xmlns="vcard-temp"/></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="b1e82772-9d2e-474f-8677-672ce3a4a0b6" type="get"><query xmlns="jabber:iq:private"><storage xmlns="storage:bookmarks"/></query></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="e3e1361c-1541-4365-ac39-011247f07b33" type="get"><query ver="1" xmlns="jabber:iq:roster"/></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="991f5f2a-d923-4fa6-8dc9-e5ab065e983c" to="xmpp.is" type="get"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <presence><status></status><x xmlns="vcard-temp:x:update"><photo></photo></x><c hash="sha-1" node="http://swift.im" ver="3ScHZH4hKmksks0e7RG8B4cjaT8=" xmlns="http://jabber.org/protocol/caps"/></presence>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="c6facf37-8e9e-45cc-a86d-6e6b5a315911" to="xmpp.is" type="get"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <r xmlns='urn:xmpp:sm:2'/>
    <!-- OUT 2018-09-15T16:19:40 -->
    <a h="1" xmlns="urn:xmpp:sm:2"/>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='e69a06ef-8f3b-4492-95cf-206b252363bf' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0'><vCard xmlns='vcard-temp'><VERSION>3.0</VERSION><NICKNAME>snoo</NICKNAME><EMAIL><USERID>foo@bar.com</USERID></EMAIL></vCard></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='b1e82772-9d2e-474f-8677-672ce3a4a0b6' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0'><query xmlns='jabber:iq:private'><storage xmlns='storage:bookmarks'/></query></iq><iq id='e3e1361c-1541-4365-ac39-011247f07b33' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0'/><iq id='991f5f2a-d923-4fa6-8dc9-e5ab065e983c' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0' from='xmpp.is'><query xmlns='http://jabber.org/protocol/disco#info'><identity type='pep' name='Prosody' category='pubsub'/><identity type='im' name='Prosody' category='server'/><feature var='urn:xmpp:blocking'/><feature var='urn:xmpp:ping'/><feature var='msgoffline'/><feature var='jabber:iq:version'/><feature var='vcard-temp'/><feature var='jabber:iq:roster'/><feature var='urn:xmpp:time'/><feature var='jabber:iq:time'/><feature var='jabber:iq:private'/><feature var='http://jabber.org/protocol/commands'/><feature var='jabber:iq:register'/><feature var='http://jabber.org/protocol/pubsub#publish'/><feature var='http://jabber.org/protocol/disco#info'/><feature var='http://jabber.org/protocol/disco#items'/><feature var='jabber:iq:last'/><feature var='urn:xmpp:carbons:2'/><feature var='urn:xmpp:carbons:1'/><x type='result' xmlns='jabber:x:data'><field type='hidden' var='FORM_TYPE'><value>http://jabber.org/network/serverinfo</value></field><field type='list-multi' var='feedback-addresses'><value>https://xmpp.is/contact/</value></field><field type='list-multi' var='admin-addresses'><value>https://xmpp.is/contact/</value></field><field type='list-multi' var='abuse-addresses'><value>https://xmpp.is/contact/</value></field><field type='list-multi' var='support-addresses'><value>https://xmpp.is/contact/</value></field></x></query></iq><presence from='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0'><status/><x xmlns='vcard-temp:x:update'><photo/></x><c hash='sha-1' ver='3ScHZH4hKmksks0e7RG8B4cjaT8=' node='http://swift.im' xmlns='http://jabber.org/protocol/caps'/></presence><iq id='c6facf37-8e9e-45cc-a86d-6e6b5a315911' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0' from='xmpp.is'><query xmlns='http://jabber.org/protocol/disco#info'><identity type='pep' name='Prosody' category='pubsub'/><identity type='im' name='Prosody' category='server'/><feature var='urn:xmpp:blocking'/><feature var='urn:xmpp:ping'/><feature var='msgoffline'/><feature var='jabber:iq:version'/><feature var='vcard-temp'/><feature var='jabber:iq:roster'/><feature var='urn:xmpp:time'/><feature var='jabber:iq:time'/><feature var='jabber:iq:private'/><feature var='http://jabber.org/protocol/commands'/><feature var='jabber:iq:register'/><feature var='http://jabber.org/protocol/pubsub#publish'/><feature var='http://jabber.org/protocol/disco#info'/><feature var='http://jabber.org/protocol/disco#items'/><feature var='jabber:iq:last'/><feature var='urn:xmpp:carbons:2'/><feature var='urn:xmpp:carbons:1'/><x type='result' xmlns='jabber:x:data'><field type='hidden' var='FORM_TYPE'><value>http://jabber.org/network/serverinfo</value></field><field type='list-multi' var='feedback-addresses'><value>https://xmpp.is/contact/</value></field><field type='list-multi' var='admin-addresses'><value>https://xmpp.is/contact/</value></field><field type='list-multi' var='abuse-addresses'><value>https://xmpp.is/contact/</value></field><field type='list-multi' var='support-addresses'><value>https://xmpp.is/contact/</value></field></x></query></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="97eefcfd-204b-4afd-9ea1-cc10962d892b" to="xmpp.is" type="get"><query node="http://jabber.org/protocol/commands" xmlns="http://jabber.org/protocol/disco#items"/></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="4ed568f6-7c8c-46fe-9068-4a2a81bdd393" type="get"><blocklist xmlns="urn:xmpp:blocking"/></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="f673e890-7643-46a0-b5f4-230c5b384c8b" type="set"><enable xmlns="urn:xmpp:carbons:2"/></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="d0b62e41-afa5-48e8-a0e7-143c9a328c35" to="xmpp.is" type="get"><query xmlns="http://jabber.org/protocol/disco#items"/></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <r xmlns='urn:xmpp:sm:2'/>
    <!-- OUT 2018-09-15T16:19:40 -->
    <a h="7" xmlns="urn:xmpp:sm:2"/>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='97eefcfd-204b-4afd-9ea1-cc10962d892b' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0' from='xmpp.is'><query node='http://jabber.org/protocol/commands' xmlns='http://jabber.org/protocol/disco#items'><item jid='xmpp.is' name='Ping' node='ping'/><item jid='xmpp.is' name='Get uptime' node='uptime'/></query></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='4ed568f6-7c8c-46fe-9068-4a2a81bdd393' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0'><blocklist xmlns='urn:xmpp:blocking'/></iq><iq id='f673e890-7643-46a0-b5f4-230c5b384c8b' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0'/><iq id='d0b62e41-afa5-48e8-a0e7-143c9a328c35' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0' from='xmpp.is'><query xmlns='http://jabber.org/protocol/disco#items'><item jid='upload.xmpp.is'/><item jid='muc.xmpp.is' name='XMPP.is MUC'/></query></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="a3838d36-3d3b-4d8b-afda-e46b49ce0fdf" to="upload.xmpp.is" type="get"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>
    <!-- OUT 2018-09-15T16:19:40 -->
    <iq id="76c58b53-545e-40ef-8832-0beb6a74a50e" to="muc.xmpp.is" type="get"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <r xmlns='urn:xmpp:sm:2'/>
    <!-- OUT 2018-09-15T16:19:40 -->
    <a h="11" xmlns="urn:xmpp:sm:2"/>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='a3838d36-3d3b-4d8b-afda-e46b49ce0fdf' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0' from='upload.xmpp.is'><query xmlns='http://jabber.org/protocol/disco#info'><identity type='file' name='HTTP File Upload' category='store'/><feature var='urn:xmpp:http:upload:0'/><feature var='urn:xmpp:http:upload'/><feature var='http://jabber.org/protocol/disco#info'/><feature var='http://jabber.org/protocol/disco#items'/><x type='result' xmlns='jabber:x:data'><field type='hidden' var='FORM_TYPE'><value>urn:xmpp:http:upload:0</value></field><field type='text-single' var='max-file-size'><value>10000000</value></field></x><x type='result' xmlns='jabber:x:data'><field type='hidden' var='FORM_TYPE'><value>urn:xmpp:http:upload</value></field><field type='text-single' var='max-file-size'><value>10000000</value></field></x></query></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <iq id='76c58b53-545e-40ef-8832-0beb6a74a50e' type='result' to='snoo@xmpp.is/10ce5033-4f48-4f70-8f88-8c8f2e0525f0' from='muc.xmpp.is'><query xmlns='http://jabber.org/protocol/disco#info'><identity type='text' name='XMPP.is MUC' category='conference'/><feature var='http://jabber.org/protocol/muc'/><feature var='http://jabber.org/protocol/commands'/><feature var='http://jabber.org/protocol/disco#info'/><feature var='http://jabber.org/protocol/disco#items'/></query></iq>
    <!-- IN 2018-09-15T16:19:40 -->
    <r xmlns='urn:xmpp:sm:2'/>
    <!-- OUT 2018-09-15T16:19:40 -->
    <a h="13" xmlns="urn:xmpp:sm:2"/>
    

    我第一次尝试从命令行模拟swift的做法:

    openssl s_client -starttls xmpp -connect xmpp.is:5222
    CONNECTED(00000003)
    depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
    verify return:1
    depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
    verify return:1
    depth=0 CN = xmpp.is
    verify return:1
    ---
    Certificate chain
     0 s:/CN=xmpp.is
       i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
     1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
       i:/O=Digital Signature Trust Co./CN=DST Root CA X3
    ---
    Server certificate
    -----BEGIN CERTIFICATE-----
    MIIHazCCBlOgAwIBAgISA8Vupt6pSMDO3eLJAR+p6kioMA0GCSqGSIb3DQEBCwUA
    [DELETED MOST OF THE CERTIFICATE]
    XTe7RnD/qWEeN3o0dj8yBJE+dDG74QBST5ihqjZoEA==
    -----END CERTIFICATE-----
    subject=/CN=xmpp.is
    issuer=/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
    ---
    No client certificate CA names sent
    Client Certificate Types: RSA sign, DSA sign, ECDSA sign
    Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
    Shared Requested Signature Algorithms: RSA+SHA512:DSA+SHA512:ECDSA+SHA512:RSA+SHA384:DSA+SHA384:ECDSA+SHA384:RSA+SHA256:DSA+SHA256:ECDSA+SHA256:RSA+SHA224:DSA+SHA224:ECDSA+SHA224:RSA+SHA1:DSA+SHA1:ECDSA+SHA1
    Peer signing digest: SHA512
    Server Temp Key: ECDH, P-384, 384 bits
    ---
    SSL handshake has read 4238 bytes and written 641 bytes
    ---
    New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-GCM-SHA384
    Server public key is 4096 bit
    Secure Renegotiation IS supported
    Compression: NONE
    Expansion: NONE
    No ALPN negotiated
    SSL-Session:
        Protocol  : TLSv1.2
        Cipher    : ECDHE-RSA-AES256-GCM-SHA384
        Session-ID:
        Session-ID-ctx:
        Master-Key: C7BAD8006A9058DEB850C31C07AD8DC3F6ABF39740A9477BAC2F191C0AD5A35CA70C1ACE08AF3B5357FBC97F226402F3
        Key-Arg   : None
        PSK identity: None
        PSK identity hint: None
        SRP username: None
        Start Time: 1537024886
        Timeout   : 300 (sec)
        Verify return code: 0 (ok)
    ---
    <?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="xmpp.is" version="1.0">
    <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' xml:lang='en' from='xmpp.is' id='18367b2a-2df5-4dd9-be5f-607c05d6760f' version='1.0' xmlns='jabber:client'><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>SCRAM-SHA-1</mechanism><mechanism>SCRAM-SHA-1-PLUS</mechanism></mechanisms></stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
    <failure xmlns='urn:ietf:params:xml:ns:xmpp-tls'/></stream:stream>closed
    

    发出以下命令后,流关闭:

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

    使用:

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

    我猜可能是因为我已经从命令行打开了TLS连接。所以我想我应该跳过前两个命令,直接进行身份验证。以下是我新尝试的课程:

    openssl s_client -starttls xmpp -connect xmpp.is:5222
    CONNECTED(00000003)
    ...
    <?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="xmpp.is" version="1.0">
    <?xml version='1.0'?><stream:stream xmlns:stream='http://etherx.jabber.org/streams' xml:lang='en' from='xmpp.is' id='f57f8d05-6550-42ac-b458-775b8cb78319' version='1.0' xmlns='jabber:client'><stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>SCRAM-SHA-1</mechanism><mechanism>SCRAM-SHA-1-PLUS</mechanism></mechanisms></stream:features><auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="SCRAM-SHA-1-PLUS">cD10bHMtdW5pcXVlLCxuPXNub28scj1kYjIxNzM5Mi0yZmJkLTQxMmMtYmM4Ny00Mzg2MWZjMzMxZTM=</auth>
    <challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>cj1kYjIxNzM5Mi0yZmJkLTQxMmMtYmM4Ny00Mzg2MWZjMzMxZTNhZGY4MTBmMy1hMWU4LTQxZGItOGM0OS01NDAxZWQxYTQ3NjQscz1NR1ZsTVRoaFpqTXRZakpsTkMwMFlqSmtMV0V6Tm1FdFlURmhaR1JoWWpsa1pEZ3csaT00MDk2</challenge><response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">Yz1jRDEwYkhNdGRXNXBjWFZsTEN3em1qc1FHRWtPeUduUjNNST0scj1kYjIxNzM5Mi0yZmJkLTQxMmMtYmM4Ny00Mzg2MWZjMzMxZTM1YzgxZDE1MC1iZmFhLTQwNjQtOWJhNi0wYWUwNzA3YzhmMDQscD1VaFNTbmlEblM3S2I3Sm9OYUVraTRIWEJYK2M9</response>
    <failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><malformed-request/><text>Invalid channel binding value.</text></failure>
    

    现在看起来好多了,因为服务器向我发送了“挑战”,但当我发送Swift应用程序会话的响应时,它发出了:

    Invalid channel binding value
    

    我猜它在抱怨,因为我使用了Swift应用程序会话中的挑战令牌,而不是当前命令行会话中的信息。所以我想知道当我收到来自服务器的挑战时,像这样:

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

    我该如何表述这样的回答:

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

    我猜我可能需要使用服务器发送的质询令牌作为签名过程的输入。。。

    但是,如果有人知道一种更简单的方法来启动与不同公共XMPP服务器的命令行会话,那么我很乐意使用它。谢谢

    更新:

    我做了以下工作:

    • 在我的开发机器上安装了我自己的eJabberd服务器
    • 将Swift客户端中的设置更改为
      • 安全连接:从不
      • 允许通过不安全的连接发送密码:true

    enter image description here

    使用以下新设置连接到服务器的Swift日志:

    <!-- OUT 2018-09-22T11:35:47 -->
    <?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="desktop-2neut2i" version="1.0">
    <!-- IN 2018-09-22T11:35:47 -->
    <?xml version='1.0'?><stream:stream id='5884973410867271599' version='1.0' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='desktop-2neut2i' xmlns='jabber:client'>
    <!-- IN 2018-09-22T11:35:47 -->
    <stream:features><mechanisms xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><mechanism>PLAIN</mechanism><mechanism>DIGEST-MD5</mechanism><mechanism>X-OAUTH2</mechanism><mechanism>SCRAM-SHA-1</mechanism></mechanisms><starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/><register xmlns='http://jabber.org/features/iq-register'/></stream:features>
    <!-- OUT 2018-09-22T11:35:47 -->
    <auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="SCRAM-SHA-1">biwsbj1iaWxibyxyPTE3NDNjNzJiLWE2MTMtNGNhMC1hZmE2LTU4M2RkMDFiMmFiNg==</auth>
    <!-- IN 2018-09-22T11:35:47 -->
    <challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>cj0xNzQzYzcyYi1hNjEzLTRjYTAtYWZhNi01ODNkZDAxYjJhYjY5UnlVQmYxd0FzUU9vQ0hMdWhDMWlBPT0scz1WeXBnZ1hpL1k3bmxBUkk5TzA5R1dnPT0saT00MDk2</challenge>
    <!-- OUT 2018-09-22T11:35:47 -->
    <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">Yz1iaXdzLHI9MTc0M2M3MmItYTYxMy00Y2EwLWFmYTYtNTgzZGQwMWIyYWI2OVJ5VUJmMXdBc1FPb0NITHVoQzFpQT09LHA9YStFSU81a1gyeXd3L0pGYUFzR3I1aVpCMktrPQ==</response>
    <!-- IN 2018-09-22T11:35:47 -->
    <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>dj1hMHJsY1ZVUHhabEdoTU5QOW9EbGoyZEJkcEk9</success>
    <!-- OUT 2018-09-22T11:35:47 -->
    <?xml version="1.0"?><stream:stream xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" to="desktop-2neut2i" version="1.0">
    <!-- IN 2018-09-22T11:35:47 -->
    <?xml version='1.0'?><stream:stream id='8501231819433449809' version='1.0' xml:lang='en' xmlns:stream='http://etherx.jabber.org/streams' from='desktop-2neut2i' xmlns='jabber:client'>
    <!-- IN 2018-09-22T11:35:47 -->
    <stream:features><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/><session xmlns='urn:ietf:params:xml:ns:xmpp-session'><optional/></session><c ver='sg7ZnA5zzsPpRyrmVVRdsh4nhRU=' node='http://www.process-one.net/en/ejabberd/' hash='sha-1' xmlns='http://jabber.org/protocol/caps'/><sm xmlns='urn:xmpp:sm:2'/><sm xmlns='urn:xmpp:sm:3'/><csi xmlns='urn:xmpp:csi:0'/></stream:features>
    <!-- OUT 2018-09-22T11:35:47 -->
    <iq id="session-bind" type="set"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>125157816940461441277</resource></bind></iq>
    <!-- IN 2018-09-22T11:35:48 -->
    <iq type='result' id='session-bind'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>bilbo@desktop-2neut2i/125157816940461441277</jid></bind></iq>
    <!-- OUT 2018-09-22T11:35:48 -->
    <enable xmlns="urn:xmpp:sm:2"/>
    <!-- IN 2018-09-22T11:35:48 -->
    <enabled xmlns='urn:xmpp:sm:2'/>
    <!-- OUT 2018-09-22T11:35:48 -->
    <iq id="session-start" type="set"><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></iq>
    <!-- IN 2018-09-22T11:35:48 -->
    <iq xml:lang='en' to='bilbo@desktop-2neut2i/125157816940461441277' from='bilbo@desktop-2neut2i' type='result' id='session-start'/>
    <!-- OUT 2018-09-22T11:35:48 -->
    <iq id="eb7ec3d0-1aa5-448d-8dd9-8fa603905cb2" type="get"><vCard xmlns="vcard-temp"/></iq>
    <!-- OUT 2018-09-22T11:35:48 -->
    <iq id="d2bca196-93e8-46f2-b36b-14bb2ebd8670" type="get"><query xmlns="jabber:iq:private"><storage xmlns="storage:bookmarks"/></query></iq>
    <!-- OUT 2018-09-22T11:35:48 -->
    <iq id="6e5a62ef-3e7f-4eb3-9520-a10bb7206602" type="get"><query xmlns="jabber:iq:roster"/></iq>
    <!-- OUT 2018-09-22T11:35:48 -->
    <iq id="257a9caf-53fa-4e34-9bb6-5b2310e20b82" to="desktop-2neut2i" type="get"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>
    <!-- OUT 2018-09-22T11:35:48 -->
    <presence><status></status><x xmlns="vcard-temp:x:update"><photo></photo></x><c hash="sha-1" node="http://swift.im" ver="3ScHZH4hKmksks0e7RG8B4cjaT8=" xmlns="http://jabber.org/protocol/caps"/></presence>
    <!-- OUT 2018-09-22T11:35:48 -->
    <iq id="b1e68799-5ea4-47c1-98ea-7205927b3681" to="desktop-2neut2i" type="get"><query xmlns="http://jabber.org/protocol/disco#info"/></iq>
    <!-- IN 2018-09-22T11:35:48 -->
    <r xmlns='urn:xmpp:sm:2'/>
    <!-- OUT 2018-09-22T11:35:48 -->
    <a h="1" xmlns="urn:xmpp:sm:2"/>
    

    因此尝试再次登录,这次使用:

    telnet localhost 5222
    

    我粘贴了上面Swift会话中的命令。但我仍然陷入了同样的困境,我不知道如何应对服务器发出的挑战。

    我可以在以下帖子中执行一些步骤: XMPP SASL SCRAM-SHA1 Authentication

    例如使用此工具的base64解码和编码: https://www.base64decode.org/

    我想我可能错过了一些基本的东西。现在我有了自己的服务器,我希望可以禁用所有额外的安全机制,并使用普通的用户名和密码登录。但我还没有想出如何做到这一点。关于如何完成telnet登录,你有什么想法吗?

    1 回复  |  直到 3 年前
        1
  •  0
  •   Coder2000    6 年前

    您正在尝试使用SCRAM-SHA-1-PLUS进行身份验证,这是一种计算的加密交换。交换的一部分是在打开SSL连接时协商的唯一会话密钥。您将无法在命令行上使用SCRAM完成身份验证过程。您最好使用PLAIN或使用现有库来编写自己的客户端代码。