SIP注册过程分析

1、SIP注册过程图解


       注册返回结果:
       je->type == EXOSIP_REGISTRATION_FAILURE:
       je->response->status_code == 401   401unauthorized
       je->response->status_code == 403   403forbidden   (新增接口返回为用户名或者密码错误)
 
       je->type == EXOSIP_REGISTRATION_SUCCESS:
       je->response->status_code == 200  注册返回的200OK

2、过程分析

       一般情况下,关键点在于注册的验证和注册成功后的心跳。

       1)注册验证
       在客户发送请求后,收到一个401(未授权)消息,包含一个Challenge。消息里面有一个唯一的字符串:nonce,每次请求都不一样。客户将用户名密码和401消息返回的Challenge一起加密后传给服务器,加密信息保存在请求消息头中字段 response 中。
       而服务器同样会根据信息加密,然后比对客户端发过来的加密信息,如果相同则表明验证信息正确,然后服务器返回200,客户端即注册成功。

/*
step1:caculate username:realm:password MD5 value to get HA1
step2:caculate method:uri MD5 value to get HA2
step3:caculate HA1:nonce:HA2 MD5 value, it's the result
*/
 
void DigestCalcResponse(
 IN HASHHEX HA1, /* H(A1) */
 IN char * pszNonce, /* nonce from server */
 IN char * pszNonceCount, /* 8 hex digits */
 IN char * pszCNonce, /* client nonce */
 IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
 IN char * pszMethod, /* method from the request */
 IN char * pszDigestUri, /* requested URL */
 IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
 OUT HASHHEX Response /* request-digest or response-digest */
 )
{
 MD5_CTX Md5Ctx;
 HASH HA2;
 HASH RespHash;
 HASHHEX HA2Hex;
 
 // calculate H(A2)
 MD5Init(&Md5Ctx);
 MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
 MD5Update(&Md5Ctx, ":", 1);
 MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
 if (stricmp(pszQop, "auth-int") == 0) {
  MD5Update(&Md5Ctx, ":", 1);
  MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
 };
 MD5Final(HA2, &Md5Ctx);
 CvtHex(HA2, HA2Hex);
 
 // calculate response
 MD5Init(&Md5Ctx);
 MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
 MD5Update(&Md5Ctx, ":", 1);
 MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
 MD5Update(&Md5Ctx, ":", 1);
 
 if (*pszQop) 
 {
  MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
  MD5Update(&Md5Ctx, ":", 1);
  MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
  MD5Update(&Md5Ctx, ":", 1);
  MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
  MD5Update(&Md5Ctx, ":", 1);
 };
 
 MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
 MD5Final(RespHash, &Md5Ctx);
 CvtHex(RespHash, Response);
}
这个函数出现在\libeXosip2-4.0.0\src\jauth.c  中。 (上述代码中计算MD5值时切忌不可格式化成一个整字串再计算,两种方式计算结果不一样。)

       2)心跳处理
       这里  exOsip Register 心跳处理  有朋友介绍了一种方法,我目前是做服务器就没去尝试。eXosip库里有部分设置自动处理函数,还没研究,估计里面可以已经实现了不用自己创建计时器来定时认证。


参考资料:
1、关于SIP中的Authorization
2、exOsip Register 心跳处理
3、SIP(18):注册程序敲定 
4、关于eXosip的问题???

关于eXosip的问题???

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值