java - JAIN SIP Unauthorized response -
i developing sip client using jain sip library in eclipse environment.
i having trouble getting authorization. have implemented md5 challenge , added authorization second register function.
the authorization credentials correct checked them available sip application. able register , make calls it.
this code initialization , registration
string username = "username"; string server = "10.99.00.00"; string password = "password"; string realm = null ; private string nonce = null; // objects used communicate jain sip api. sipfactory sipfactory; // used access sip api. sipstack sipstack; // sip stack. sipprovider sipprovider; // used send sip messages. messagefactory messagefactory; // used create sip message factory. headerfactory headerfactory; // used create sip headers. addressfactory addressfactory; // used create sip uris. listeningpoint listeningpoint; // sip listening ip address/port. properties properties; // other properties. clienttransaction invitetid; request request; response response; // objects keeping local configuration. string proxy = null; string sipip="10.99.00.00"; string localip= null; // local ip address. int sipport = 5060; // local port. int rport = 52216; string protocol = "udp"; // local protocol (udp). int tag = (new random()).nextint(); // local tag. address contactaddress; // contact address. contactheader contactheader; // contact header. private dialog dialog; private logger logger; private string current_process; public test() throws nosuchalgorithmexception, parseexception{ init(); response response = null; register(response); } public void init() { try { // local ip address. localip = inetaddress.getlocalhost().gethostaddress(); // create sip factory , set path name. sipfactory = sipfactory.getinstance(); sipfactory.setpathname("gov.nist"); // create , set sip stack properties. properties = new properties(); properties.setproperty("javax.sip.stack_name", "stack"); properties.setproperty("gov.nist.javax.sip.trace_level", "32"); if(proxy != null) { properties.setproperty("javax.sip.outbound_proxy", sipip + ':' + sipport + '/' + protocol); } properties.setproperty("gov.nist.javax.sip.log_message_content", "true"); properties.setproperty("gov.nist.javax.sip.debug_log", "mss-jsip-debuglog.txt"); properties.setproperty("gov.nist.javax.sip.server_log","mss-jsip-messages.xml"); // create sip stack. sipstack = sipfactory.createsipstack(this.properties); // create sip message factory. messagefactory = sipfactory.createmessagefactory(); // create sip header factory. headerfactory = sipfactory.createheaderfactory(); // create sip address factory. addressfactory = sipfactory.createaddressfactory(); // create sip listening point , bind local ip // address, port , protocol. listeningpoint = sipstack.createlisteningpoint(localip, rport, protocol); // create sip provider. sipprovider = sipstack.createsipprovider(listeningpoint); // add our application sip listener. sipprovider.addsiplistener(this); // display local ip address , port in text area. } catch (exception e) { e.printstacktrace(); // if error occurs, display error message box , exit. system.exit(-1); } } int cseq; public void register(response response) { try { cseq++; current_process = cseq + "register"; arraylist viaheaders = new arraylist(); viaheader viaheader = headerfactory.createviaheader(localip, rport, "udp", null); viaheader.setrport(); viaheaders.add(viaheader); // "max-forwards" header. maxforwardsheader maxforwardsheader = headerfactory.createmaxforwardsheader(70); // "call-id" header. callidheader callidheader = sipprovider.getnewcallid(); // "cseq" header. @suppresswarnings("deprecation") cseqheader cseqheader = headerfactory.createcseqheader(1l,request.register); address fromaddress = addressfactory.createaddress("sip:" + "username" + '@' + server); fromheader fromheader = headerfactory.createfromheader( fromaddress, string.valueof(this.tag)); // "to" header. toheader toheader = headerfactory.createtoheader(fromaddress , null); // create contact address used sip messages. contactaddress = addressfactory.createaddress("sip:" + username + "@"+ localip +":"+rport+ ";"+ "transport=udp"); // create contact header used sip messages. contactheader = headerfactory.createcontactheader(contactaddress); uri requesturi = addressfactory.createuri("sip:" + server); request = messagefactory.createrequest(requesturi, request.register,callidheader, cseqheader, fromheader, toheader, viaheaders, maxforwardsheader); request.addheader(contactheader); // system.out.println(request.tostring()); if (response != null) { authorizationheader authheader = makeauthheader(headerfactory, response, request, username, password); request.addheader(authheader); } invitetid = sipprovider.getnewclienttransaction(request); // send request out. invitetid.sendrequest(); // dialog = invitetid.getdialog(); system.out.println(request.tostring()); // send request statelessly through sip provider. // this.sipprovider.sendrequest(request); // display message in text area. // logger.debug("request sent:\n" + request.tostring() + "\n\n"); } catch (exception e) { // if error occurred, display error. e.printstacktrace(); // logger.debug("request sent failed: " + e.getmessage() + "\n"); } } private authorizationheader makeauthheader(headerfactory headerfactory2, response response, request request, string username2, string password2) throws parseexception { // todo auto-generated method stub // authenticate header challenge need reply wwwauthenticateheader ah_c = (wwwauthenticateheader)response.getheader(wwwauthenticateheader.name); // authorization header build response challenge authorizationheader ah_r = headerfactory.createauthorizationheader(ah_c.getscheme()); // assemble data need create response string uri request_uri = request.getrequesturi(); string request_method = request.getmethod(); string nonce = ah_c.getnonce(); string algrm = ah_c.getalgorithm(); string realm = ah_c.getrealm(); messagedigest mdigest; try { mdigest = messagedigest.getinstance(algrm); // a1 string a1 = username + ":" + realm + ":" + password; string ha1 = tohexstring(mdigest.digest(a1.getbytes())); // a2 string a2 = request_method.touppercase() + ":" + request_uri ; string ha2 = tohexstring(mdigest.digest(a2.getbytes())); // kd string kd = ha1 + ":" + nonce + ":" + ha2; string responsenew = tohexstring(mdigest.digest(kd.getbytes())); ah_r.setusername(username); ah_r.setrealm(realm); ah_r.setnonce(nonce); ah_r.seturi(request_uri); ah_r.setalgorithm(algrm); ah_r.setresponse(responsenew); } catch (nosuchalgorithmexception e) { // todo auto-generated catch block e.printstacktrace(); } return ah_r; }
this request send , response get.
register sip:10.99.00.00 sip/2.0 via: sip/2.0/udp 10.99.00.00:52016;rport;branch=z9hg4bk- 363430-38c329167b2d9108d20c996fec776b29 max-forwards: 70 to: <sip:tusername7@10.99.00.00> from: <sip:username@10.99.00.00>;tag=421569181 call-id: 37cd8463e628a6960f62267027cf0720@10.99.00.00 cseq: 1 register contact: <sip:username@10.99.00.00:52016;transport=udp> content-length: 0 sip/2.0 401 unauthorized via: sip/2.0/udp 10.99.00.00:52016;branch=z9hg4bk- 363430-38c329167b2d9108d20c996fec776b29;received=10.99.00.00;rport=52016 from: <sip:username@10.99.00.00>;tag=421569181 to: <sip:username@10.99.00.00>;tag=as64c39fdc call-id: 37cd8463e628a6960f62267027cf0720@10.99.00.00 cseq: 1 register server: asterisk pbx 10.5.1 allow: invite,ack,cancel,options,bye,refer,subscribe,notify,info,publish supported: replaces,timer www-authenticate: digest algorithm=md5,realm="xyz.com",nonce="13250a39" content-length: 0 register sip:10.99.00.00 sip/2.0 via: sip/2.0/udp 10.99.00.00:52016;rport;branch=z9hg4bk- 363430-19fd7f5d12dc78762617b26d61129919 max-forwards: 70 to: <sip:username@10.99.00.00> from: <sip:username@10.99.00.00>;tag=421569181 call-id: 68bd42d26ac8f9f90729927434eb5ad3@10.99.70.106 cseq: 2 register contact: <sip:username@10.99.00.00:52016;transport=udp> authorization: digest username="username",realm="xyz.com",nonce="13250a39",uri="sip:10.99.00.00",algorithm=md5,response="f525cda4442d7388e6ea4a737e46b639" content-length: 0 sip/2.0 401 unauthorized via: sip/2.0/udp 10.99.00.00:52016;branch=z9hg4bk- 363430-19fd7f5d12dc78762617b26d61129919;received=10.99.00.00;rport=52016 from: <sip:username@10.99.00.00>;tag=421569181 to: <sip:username@10.99.00.00>;tag=as3b3b0796 call-id: 68bd42d26ac8f9f90729927434eb5ad3@10.99.00.00 cseq: 2 register server: asterisk pbx 10.5.1 allow: invite,ack,cancel,options,bye,refer,subscribe,notify,info,publish supported: replaces,timer www-authenticate: digest algorithm=md5,realm="xyz.com",nonce="22cbe904" content-length: 0
and when used sip application same credentials got request , response
2015-04-22 11:55:42,794 sent 10.99.00.00/5060 [awt-eventqueue-0] register sip:10.99.00.00 sip/2.0 via: sip/2.0/udp 10.99.00.00:52016;rport;branch=z9hg4bkcabnbde6g max-forwards: 70 to: <sip:username@10.99.00.00> from: <sip:username@10.99.00.00>;tag=vgbh8m9a call-id: mcbf4794-1429696542758@10.99.00.00 cseq: 1 register contact: <sip:username@10.99.00.00:52016;transport=udp> 2015-04-22 11:55:42,795 received 10.99.00.00/5060 [transportmanager 0] sip/2.0 401 unauthorized via: sip/2.0/udp 10.99.00.00:52016;branch=z9hg4bkcabnbde6g; received=10.99.00.00;rport=52016 from: <sip:username@10.99.00.00>;tag=vgbh8m9a to: <sip:username@10.99.00.00>;tag=as7c9471aa call-id: mcbf4794-1429696542758@10.99.00.00 cseq: 1 register server: asterisk pbx 10.5.1 allow: invite, ack, cancel, options, bye, refer, subscribe, notify, info, publish supported: replaces, timer www-authenticate: digest algorithm=md5, realm="xyz.com", nonce="7d0754cc" content-length: 0 2015-04-22 11:55:43,637 sent 10.99.00.00/5060 [transportmanager 0] register sip:10.99.00.00 sip/2.0 via: sip/2.0/udp 10.99.00.00:52016;rport;branch=z9hg4bk3oe6xiih8 max-forwards: 70 to: <sip:username@10.99.00.00> from: <sip:username@10.99.00.00>;tag=vgbh8m9a call-id: mcbf4794-1429696542758@10.99.00.00 cseq: 2 register contact: <sip:username@10.99.00.00:52016;transport=udp> authorization: digest username="username", realm="xyz.com", nonce="7d0754cc", uri="sip:10.99.00.00", response="4150b8392729806ff601eb6d67da7c19" 2015-04-22 11:55:43,638 received 10.99.00.00/5060 [transportmanager 0] options sip:username@10.99.00.00:52016;transport=udp sip/2.0 via: sip/2.0/udp 10.99.00.00:5060;branch=z9hg4bk21f59b09 max-forwards: 70 from: "asterisk" <sip:asterisk@10.99.00.00>;tag=as2093e268 to: <sip:username@10.99.00.00:52016;transport=udp> contact: <sip:asterisk@10.99.00.00:5060> call-id: 77805e3c524799632da223b942a4e8f1@10.99.00.00:5060 cseq: 102 options user-agent: asterisk pbx 10.5.1 date: wed, 22 apr 2015 09:55:43 gmt allow: invite, ack, cancel, options, bye, refer, subscribe, notify, info, publish supported: replaces, timer content-length: 0 2015-04-22 11:55:43,660 received 10.99.00.00/5060 [transportmanager 0] sip/2.0 200 ok via: sip/2.0/udp 10.99.00.00:52016;branch=z9hg4bk3oe6xiih8;received=10.99.00.00;rport=52016 from: <sip:username@10.99.00.00>;tag=vgbh8m9a to: <sip:username@10.99.00.00>;tag=as7c9471aa call-id: mcbf4794-1429696542758@10.99.00.00 cseq: 2 register server: asterisk pbx 10.5.1 allow: invite, ack, cancel, options, bye, refer, subscribe, notify, info, publish supported: replaces, timer expires: 240 contact: <sip:username@10.99.00.00:52016;transport=udp>;expires=240 date: wed, 22 apr 2015 09:55:43 gmt content-length: 0
i compared both packets , didnt find difference. dont understand why not geeting authorized. localip , sipip different in case.
i think problem might ports didnt find on net assigning rport , sipport: 5060. more information on it.
the call ids on both registers cseq 1 , cseq 2 should same. different in case.
Comments
Post a Comment