2015-04-22 2 views
2

Я разрабатываю клиент SIP, используя JAIN SIP-библиотеку в среде eclipse.JAIN SIP Несанкционированный отклик

У меня возникли проблемы с получением разрешения. Я также выполнил задачу MD5 и добавил авторизацию во вторую функцию Register.

Уполномоченные полномочия также верны, поскольку я проверил их с помощью доступного приложения SIP. Я смог зарегистрироваться и сделать с ним звонки.

Это код для инициализации и регистрации

String username = "username"; 
String server = "10.99.00.00"; 
String password = "password"; 
String realm = null ; 
private String nonce = null; 

// Objects used to communicate to the JAIN SIP API. 
SipFactory sipFactory;   // Used to access the SIP API. 
SipStack sipStack;    // The SIP stack. 
SipProvider sipProvider;  // Used to send SIP messages. 
MessageFactory messageFactory; // Used to create SIP message factory. 
HeaderFactory headerFactory; // Used to create SIP headers. 
AddressFactory addressFactory; // Used to 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; 
// The local IP address. 
int sipport = 5060;    // The local port. 
int rport = 52216; 
String protocol = "UDP";  // The local protocol (UDP). 
int tag = (new Random()).nextInt(); // The local tag. 
Address contactAddress;   // The contact address. 
ContactHeader contactHeader; // The 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 { 
    // Get the local IP address. 
    localIP = InetAddress.getLocalHost().getHostAddress(); 

    // Create the SIP factory and set the path name. 
    sipFactory = SipFactory.getInstance(); 
    sipFactory.setPathName("gov.nist"); 
    // Create and set the 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 the SIP stack. 
    sipStack = sipFactory.createSipStack(this.properties); 
    // Create the SIP message factory. 
    messageFactory = sipFactory.createMessageFactory(); 
    // Create the SIP header factory. 
    headerFactory = sipFactory.createHeaderFactory(); 
    // Create the SIP address factory. 
    addressFactory = sipFactory.createAddressFactory(); 
    // Create the SIP listening point and bind it to the local IP 
    // address, port and protocol. 
    listeningPoint = sipStack.createListeningPoint(localIP, rport, protocol); 
    // Create the SIP provider. 
    sipProvider = sipStack.createSipProvider(listeningPoint); 
    // Add our application as a SIP listener. 
    sipProvider.addSipListener(this); 


    // Display the local IP address and port in the text area. 
    } catch (Exception e) { 
    e.printStackTrace(); 
    // If an error occurs, display an error message box and 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); 
    // The "Max-Forwards" header. 
    MaxForwardsHeader maxForwardsHeader = headerFactory.createMaxForwardsHeader(70); 
    // The "Call-Id" header. 
    CallIdHeader callIdHeader = sipProvider.getNewCallId(); 
    // The "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)); 
    // The "To" header. 

    ToHeader toHeader = headerFactory.createToHeader(fromAddress , null); 

    // Create the contact address used for all SIP messages. 
    contactAddress = addressFactory.createAddress("sip:" + username + "@"+ localIP +":"+rport+ ";"+ "transport=UDP"); 
    // Create the contact header used for all 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 the request out. 
    inviteTid.sendRequest(); 

//  dialog = inviteTid.getDialog(); 

    System.out.println(request.toString()); 
    // Send the request statelessly through the SIP provider. 
//   this.sipProvider.sendRequest(request); 

    // Display the message in the text area. 
//  logger.debug("Request sent:\n" + request.toString() + "\n\n"); 
    } catch (Exception e) { 
    // If an error occurred, display the 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 with challenge we need to reply to 
    WWWAuthenticateHeader ah_c = (WWWAuthenticateHeader)response.getHeader(WWWAuthenticateHeader.NAME); 

    // Authorization header we will build with response to challenge 
    AuthorizationHeader ah_r = headerFactory.createAuthorizationHeader(ah_c.getScheme()); 

    // assemble data we need to 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; 

} 

Это запрос я посылаю и ответ я получаю.

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:[email protected]> 
From: <sip:[email protected]>;tag=421569181 
Call-ID: [email protected] 
CSeq: 1 REGISTER 
Contact: <sip:[email protected]: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:[email protected]>;tag=421569181 
To: <sip:[email protected]>;tag=as64c39fdc 
Call-ID: [email protected] 
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:[email protected]> 
From: <sip:[email protected]>;tag=421569181 
Call-ID: [email protected] 
CSeq: 2 REGISTER 
Contact: <sip:[email protected]: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:[email protected]>;tag=421569181 
To: <sip:[email protected]>;tag=as3b3b0796 
Call-ID: [email protected] 
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 

И когда я использовал приложение SIP с тем же учетными данными, я получил этот запрос и ответ

2015-04-22 11:55:42,794 SENT to 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:[email protected]> 
From: <sip:[email protected]>;tag=vGbh8M9A 
Call-ID: [email protected] 
CSeq: 1 REGISTER 
Contact: <sip:[email protected]:52016;transport=UDP> 


2015-04-22 11:55:42,795 RECEIVED from 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:[email protected]>;tag=vGbh8M9A 
To: <sip:userna[email protected]>;tag=as7c9471aa 
Call-ID: [email protected] 
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 to 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:[email protected]> 
From: <sip:[email protected]>;tag=vGbh8M9A 
Call-ID: [email protected] 
CSeq: 2 REGISTER 
Contact: <sip:[email protected]: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 from 10.99.00.00/5060 [TransportManager 0] 

OPTIONS sip:[email protected]:52016;transport=UDP SIP/2.0 
Via: SIP/2.0/UDP 10.99.00.00:5060;branch=z9hG4bK21f59b09 
Max-Forwards: 70 
From: "asterisk" <sip:[email protected]>;tag=as2093e268 
To: <sip:[email protected]:52016;transport=UDP> 
Contact: <sip:[email protected]:5060> 
Call-ID: [email protected]: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 from 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:[email protected]>;tag=vGbh8M9A 
To: <sip:[email protected]>;tag=as7c9471aa 
Call-ID: [email protected] 
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:[email protected]:52016;transport=UDP>;expires=240 
Date: Wed, 22 Apr 2015 09:55:43 GMT 
Content-Length: 0 

Я сравнил как пакеты и не нашел никакой разницы. Я не понимаю, почему я не авторизуюсь. Также localIP и SIPIP различны в этом случае.

Я думаю, что проблема может быть связана с портами, но я не нашел никакой помощи в сети для назначения rport и sipport: 5060. Я также хотел бы получить дополнительную информацию об этом.

+0

Это типичная ошибка * uri = "sip: 10.99..00.00" * при второй попытке РЕГИСТРАЦИИ? (не то, что есть две точки с целями) – jsantander

+0

Да, это ошибка ввода, я перепутал свои IP-адреса. – gourig

+0

Эй, пожалуйста, добавьте понравившийся этот тестовый проект. Я не могу выполнить звонок из-за авторизации. Заранее спасибо. – Redone

ответ

1

Идентификаторы вызовов на обоих РЕГИСТРАЦИЯх CSeq 1 и CSeq 2 должны быть одинаковыми. В вашем случае они различны.

+0

Как я могу это исправить? – gourig

+0

Привет, я исправил проблему, но теперь, я получаю SIP/2.0 482 (обнаружено Loop Detected) после второго запроса на регистрацию – gourig

+0

Если вы получаете Loop Detected, то вашему серверу не нравится тот же идентификатор вызова. Я думаю, что ваши журналы были отредактированы слишком много, и теперь мы можем не заметить проблему. Можете ли вы опубликовать оригинальные журналы, работающие и неработающие. Проблема заключается в требованиях третьей стороны, а не в jain-sip, поэтому трудно сказать, не имея хорошего образца. Это должно быть что-то очевидное в журналах. Я думаю, что звездочка потребует от вас установить правильное царство, которое оно само распознает, так что это одна из возможных причин. В одном из заголовков Digest есть что-то странное. Загрузите журналы где-нибудь, и это будет легче сказать. –

 Смежные вопросы

  • Нет связанных вопросов^_^