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

Popular posts from this blog

c++ - No viable overloaded operator for references a map -

java - Custom OutputStreamAppender not run: LOGBACK: No context given for <MYAPPENDER> -

java - Cannot secure connection using TLS -