簡體   English   中英

Jain-Sip認證

[英]Jain-Sip Authentication

我正在使用Jain Sip庫,嘗試創建與星號服務器的連接。 我一直在使用此頁面中的textclient示例應用程序: http//www.oracle.com/technetwork/articles/entarch/introduction-jain-sip-090386.html

但這實際上並沒有與服務器進行身份驗證。 我可以向服務器上的用戶發送消息,但我通常需要在服務器上進行用戶/密碼身份驗證。

據我所知,我必須使用“javax.sip.OUTBOUND_PROXY”屬性,但我找不到有關如何設置用戶名或密碼的任何文檔。 有沒有人有這個成功?

我在注冊時找到的最好的例子就在這里 以下是如果鏈接在某一天干涸的話:

REGISTER請求用於更新REGISTRAR服務器上用戶的當前位置。 應用程序發送REGISTER消息,通知服務器其當前位置,該位置又存儲在位置服務器中。 當呼叫者呼叫用戶時,代理服務器使用此信息來查找被呼叫者的位置。

注冊請求應由客戶定期發送。 REGISTER請求的有效性由Expires頭確定。

圖片

樣品申請

 REGISTER sip:sip.linphone.org SIP/2.0 Call-ID: 0a0f14355fa76ae6435b98bfe085baf9@223.1.1.128 CSeq: 1 REGISTER From: <sip:vkslabs@sip.linphone.org>;tag=-1427592833 To: <sip:vkslabs@sip.linphone.org> Max-Forwards: 70 Via: SIP/2.0/TCP 223.1.1.128:5060;branch=z9hG4bK-323532-2a454f4ec2a4213f6d6928eba479521d Contact: <sip:vkslabs@223.1.1.128;transport=tcp> Content-Length: 0 

現在讓我們看看如何使用NIST SIP Stack構建上述請求。

第一步是創建一個實現SIPListener的類。 確保您的SIP堆棧正在初始化NIST JAIN SIP堆棧。

  1. 創建Call-ID標頭

    CallIdHeader callIdHeader = this.sipProvider.getNewCallId();

  2. 創建CSeq標頭

    CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq,“REGISTER”);

  3. 創建From標題

    地址fromAddress = addressFactory.createAddress(“sip:”+ username +'@'+ server); FromHeader fromHeader = this.headerFactory.createFromHeader(fromAddress,String.valueOf(this.tag));

  4. 創建標題

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

  5. 創建Max-Forwards標頭

    MaxForwardsHeader maxForwardsHeader = this.headerFactory.createMaxForwardsHeader(70);

  6. 創建一個Via標頭

    ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip,this.port,“tcp”,null); viaHeaders.add(VIAHEADER);

  7. 創建聯系人標題

    this.contactAddress = this.addressFactory.createAddress(“sip:”+ this.username +'@'+ this.ip +“transport = tcp”);

    //創建用於所有SIP消息的聯系人標頭。 this.contactHeader = this.headerFactory.createContactHeader(contactAddress);

創建所有標頭后,就可以自己創建請求了。

 request = this.messageFactory.createRequest("REGISTER sip:" + server + "SIP/2.0\\r\\n\\r\\n"); request.addHeader(callIdHeader); request.addHeader(cSeqHeader); request.addHeader(fromHeader); request.addHeader(toHeader); request.addHeader(maxForwardsHeader); request.addHeader(viaHeader); request.addHeader(contactHeader); 

現在,使用所有必需的頭創建了請求對象,是時候發送請求了。

 inviteTid = sipProvider.getNewClientTransaction(request); // send the request out. inviteTid.sendRequest(); 

成功發送請求后,響應將使用SIPListener中的processResponse回調傳遞給應用程序。

 public void processResponse(ResponseEvent responseEvent) { int statusCode = responseEvent.getResponse().getStatusCode(); } 

 public void register(Response response) { try { cseq++; ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip, this.port, "tcp", null); viaHeaders.add(viaHeader); // The "Max-Forwards" header. MaxForwardsHeader maxForwardsHeader = this.headerFactory .createMaxForwardsHeader(70); // The "Call-Id" header. CallIdHeader callIdHeader = this.sipProvider.getNewCallId(); // The "CSeq" header. CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq, "REGISTER"); Address fromAddress = addressFactory.createAddress("sip:" + username + '@' + server); FromHeader fromHeader = this.headerFactory.createFromHeader( fromAddress, String.valueOf(this.tag)); // The "To" header. ToHeader toHeader = this.headerFactory.createToHeader(fromAddress, null); // this.contactHeader = this.headerFactory // .createContactHeader(contactAddress); request = this.messageFactory.createRequest("REGISTER sip:" + server + " SIP/2.0\\r\\n\\r\\n"); request.addHeader(callIdHeader); request.addHeader(cSeqHeader); request.addHeader(fromHeader); request.addHeader(toHeader); request.addHeader(maxForwardsHeader); request.addHeader(viaHeader); request.addHeader(contactHeader); if (response != null) { retry = true; AuthorizationHeader authHeader = Utils.makeAuthHeader(headerFactory, response, request, username, password); request.addHeader(authHeader); } inviteTid = sipProvider.getNewClientTransaction(request); // send the request out. inviteTid.sendRequest(); this.dialog = inviteTid.getDialog(); // 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"); } } 

您還可以在此處查看有關身份驗證的參考文章。 以下是如果鏈接在某一天干涸的話:

在SIP請求期間,如果服務器響應401 Proxy Authentication Required或401 Unauthorized,則表示客戶端必須使用MD5質詢再次重播相同的請求。

客戶端應使用響應頭WWW-Authenticate中的nonce值。

WWW-Authenticate:Digest realm =“sip.linphone.org”,nonce =“JbAO1QAAAAA3aDI0AADMobiT7toAAAAA”,opaque =“+ GNywA ==”,algorithm = MD5,qop =“auth”

客戶端應使用nonce生成MD5質詢並使用Authorization標頭再次發出原始請求。

創建MD5挑戰的步驟

  1. 使用用戶名+“:”+ realm +“:”+密碼創建第一個MD5哈希

    字符串a1 =用戶名+“:”+領域+“:”+密碼; String ha1 = toHexString(mdigest.digest(a1.getBytes()));

  2. 使用request_method +“:”+ request_uri創建第二個MD5哈希

    字符串a2 = request_method.toUpperCase()+“:”+ request_uri; String ha2 = toHexString(mdigest.digest(a2.getBytes()));

  3. 如果響應頭中的qop是“auth”,則使用步驟3a計算最終MD5哈希,否則如果它是未定義或空,則參考步驟3b。

3A。 使用ha1 +“:”+ nonce +“:”+ nonceCount +“:”+ cNonce +“:”+ qop +“:”+ ha2創建最終的MD5字符串

 String finalStr = ha1 + ":" + nonce + ":" + nonceCount + ":" + cNonce + ":" + qop + ":" + ha2; String response = toHexString(mdigest.digest(finalStr.getBytes())); 

3B。 使用ha1 +“:”+ nonce +“:”+ ha2創建最終的MD5字符串

 String finalStr = ha1 + ":" + nonce + ":" + ha2; String response = toHexString(mdigest.digest(finalStr.getBytes())); 

請查看此處的示例http://code.google.com/p/jain-sip/source/browse/#git%2Fsrc%2Fexamples%2Fauthorization

你為什么需要這么低的水平,使用像Mobicents這樣的SIP Servlets容器可能會更好http://code.google.com/p/sipservlets/

您可能還想查看封裝上述步驟的ClientAuthenticationHelper類:請參閱包gov.nist.javax.sip.clientauthutils

我相信在代碼庫中有一個使用示例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM