8

Jain Sipライブラリを使用して、アスタリスクサーバーへの接続を作成しようとしています。私はこのページからtextclientサンプルアプリを使用しています: http ://www.oracle.com/technetwork/articles/entarch/introduction-jain-sip-090386.html

ただし、これは実際にはサーバーで認証されません。サーバー上のユーザーにメッセージを送信できますが、通常はサーバー上でユーザー/パスワード認証が必要です。

「javax.sip.OUTBOUND_PROXY」プロパティを使用する必要があると私が知る限り、ユーザー名またはパスワードの設定方法に関するドキュメントが見つかりません。他の誰かがこれで成功しましたか?

4

3 に答える 3

9

私が登録で見つけた最良の例はここにあります。リンクがいつか枯渇した場合の要点は次のとおりです。

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

次に、NISTSIPスタックを使用して上記のリクエストを作成する方法を見てみましょう。

最初のステップは、SIPListenerを実装するクラスを作成することです。SIPスタックがNISTJAINSIPスタックを初期化していることを確認してください。

  1. Call-IDヘッダーを作成する

    CallIdHeader callIdHeader = this.sipProvider.getNewCallId();

  2. CSeqヘッダーを作成する

    CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq、 "REGISTER");

  3. ヘッダーから作成

    アドレスfromAddress=addressFactory.createAddress( "sip:"+ユーザー名+'@' +サーバー); 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 AuthenticationRequiredまたは401Unauthorizedで応答した場合、クライアントはMD5チャレンジで同じ要求を再度再生する必要があることを意味します。

クライアントは、応答ヘッダーWWW-Authenticateのnonce値を使用する必要があります。

WWW-認証:ダイジェストrealm = "sip.linphone.org"、nonce = "JbAO1QAAAAA3aDI0AADMobiT7toAAAAA"、opaque = "+ GNywA =="、algorithm = MD5、qop = "auth"

クライアントはnonceを使用してMD5チャレンジを生成し、Authorizationヘッダーを使用して元の要求を再度行う必要があります。

MD5チャレンジを作成する手順

  1. ユーザー名+「:」+レルム+「:」+パスワードを使用して最初のMD5ハッシュを作成します

    文字列a1=ユーザー名+":"+レルム+":"+パスワード; 文字列ha1=toHexString(mdigest.digest(a1.getBytes()));

  2. request_method +“:”+request_uriを使用して2番目のMD5ハッシュを作成します

    文字列a2=request_method.toUpperCase()+ ":" + request_uri; 文字列ha2=toHexString(mdigest.digest(a2.getBytes()));

  3. 応答ヘッダーのqopが「auth」の場合、最終的なMD5ハッシュはステップ3aを使用して計算されます。それ以外の場合、未定義または空の場合は、ステップ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()));
于 2013-09-17T21:52:41.743 に答える
4

ここから例を確認してくださいhttp://code.google.com/p/jain-sip/source/browse/#git%2Fsrc%2Fexamples%2Fauthorization

なぜこの低レベルにする必要があるのでしょうか。Mobicentshttp://code.google.com/p/sipservlets/などのSIPサーブレットコンテナを使用したほうがよい場合があります。

于 2012-10-23T20:34:57.387 に答える
2

上記の手順をカプセル化したClientAuthenticationHelperクラスも確認することをお勧めします。パッケージgov.nist.javax.sip.clientauthutilsを参照してください。

コードベースでの使用例があると思います。

于 2014-04-11T16:28:11.837 に答える