首页 > 其他分享 >onvif应用--IPC鉴权(认证)

onvif应用--IPC鉴权(认证)

时间:2024-09-05 18:24:17浏览次数:10  
标签:IPC const -- add soap char wsse 鉴权

一、鉴权原理

1)onvif的用户验证,是基于WS_UsernameToken,所谓的WS_UsernameToken加密,就是将用户名、密码、Nonce、Created都包含在了header里面

参数

意义

username待认证的用户名
Nonce客户端随机产生的字符串
Created请求认证的UTC时间(格式: 2023-11-29T08:05:52Z)
PasswordDigest需要Password(明文密码)、Nonce、Created经过公式生成

2)鉴权信息包括用户名、密码,在HTTP传输过程中不能是明文,有一定的加密算法

Digest鉴权是一种比基本鉴权更安全的身份验证方式,它避免了密码在网络中的明文传输

在ONVIF中,客户端使用用户名和密码的哈希值进行鉴权,服务器通过验证这个哈希值来确认身份

Digest的获取需要移植Base64编解码库、SHA1库,移植完成通过下面公式得到:

  • PasswordDigest= B64Encode( SHA1(B64DECODE(Nonce) + Created + Password(明文密码))

Nonce是一个随机数,主要用于防止重放攻击,但是它是经过Base64编码后作为字符串传输的,加密过程中,需要将Nonce解码为二进制数据,然后与Created和Password进行拼接

因此,需要先使用B64DECODE对Nonce进行解码,将其转换为二进制数据

3)有很多onvif接口在调用之前需要鉴权(即调用soap_wsse_add_UsernameTokenDigest函数),并且鉴权完一次之后还需要重新鉴权

成功认证后,可以通过调用ONVIF提供的各种服务接口,如获取设备信息、设置配置、控制摄像头等

只有以下接口是可以在不认证的情况下调用

  • GetWsdlUrl
  • GetServices
  • GetServiceCapabilities
  • GetCapabilities
  • GetHostname
  • GetSystemDateAndTime
  • GetEndpointReference
  • GetRelayOutputOptions

二、如何认证

可利用gSOAP源码中的soap_wsse_add_UsernameTokenDigest函数,可以轻松实现鉴权

1)在soapcpp2 生成ONVIF代码框架之前,要在onvif.h头文件开头加入:

#import “wsse.h”

2)依赖

包含以下文件:

  • wsseapi.c
  • wsseapi.h
  • mecevp.c
  • mecevp.h
  • smdevp.c
  • smdevp.h
  • threads.c
  • threads.h
  • dom.c

这些文件在gsoap目录和gsoap/plugin目录下,将这些文件拷贝到项目中,以便参与编译

3)makefile中必须添加编译开关-DWITH_DOM -DWITH_OPENSSL

4)安装OpenSSL

wsse系列函数依赖OpenSSL库,得去OpenSSL官网下载源代码来编译、安装,里面有我们需要的库文件和头文件,如libssl.solibcrypto.so

5)实现认证

ONVIF_SetAuthInfo函数是对soap_wsse_add_UsernameTokenDigest的二次封装

ONVIF_GetDeviceInformation函数内部增加了设置鉴权信息,在调用soap_call___tds__GetDeviceInformation之前,先调用ONVIF_SetAuthInfo函数设置鉴权信息

/* 对指定的IPC使用鉴权命令查询媒体信息 */

    struct soap *soap;  //soap环境变量         

    soap = soap_new(); //为soap申请变量空间,并初始化

    if(soap==NULL)

    {

        printf("%s : %d, can't create new soap! \n",__FUNCTION__, __LINE__);

        return -1;

    }  

    soap_set_namespaces(soap, namespaces); //设置soap的namespaces  

    /* ---- 开始获取媒体信息------ */ 

    soap_wsse_add_UsernameTokenDigest(soap, "user", username, password);

    bret = MyGetProfiles(soap, index);

    if(bret==FALSE)

    {

        printf("--ERROR: MyGetProfiles() return false!  \n");

        return FALSE;

    }

注意:但凡是ONVIF规定要鉴权的接口,每次调用之前,都要重新设置一次鉴权信息(即调用ONVIF_SetAuthInfo函数),因为IPC的应答信息会重置soap对象,导致鉴权信息丢失,所示每次都要重新设置鉴权信息

三、ONVIF Device Test Tool

1)先使用ONVIF Device Test Tool熟悉鉴权流程

搜索到设备之后需要输入设备用户名User Name及密码Password,后Check

若认证成功Scopes框弹出设备信息,Check这一步不一定要走,只是为了验证用户名或密码是否错误,但是User Name及密码Password若要进行鉴权需要填写,ONVIF Device Test Tool后续的操作会依赖这些输,入用户名及密码后,进入Debug界面

2)进入Debug界面后Authentication栏选择WS-Username token认证,继续点击Media栏,获取Media URL,ONVIF Device Test Tool需要先进行Media URL才能继续获取Media Profile。

需要优先获取到Media URL媒体服务地址,才能进行下一步,不正确的Media URL会导致获取Media Profile失败,获取Media Profile需要进行WS-Username token鉴权认证。

请求发送后右边边框会弹出响应消息,认证成功后Media Profile框下就会有TestMediaProfile(),当中可以选择Profile_x(不同Profile token对应不同码流),Profile_x主要作用在之后RTSP流获取

四、相关函数

soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id,    const char *username, const char *password) 

soap_wsse_add_UsernameTokenText(struct soap *soap, const char *id,  const char *username, const char *password) ;

soap_wsse_add_Security(struct soap *soap) ;

calc_digest(struct soap *soap, const char *created, const char *nonce, int noncelen, const char *password, char hash[SOAP_SMD_SHA1_SIZE]);

calc_nonce(struct soap *soap, char nonce[SOAP_WSSE_NONCELEN])

SHA1PadMessage(SHA1Context *context)

SHA1ProcessMessageBlock(SHA1Context *context)

SHA1Reset(SHA1Context *context)

SHA1Input(SHA1Context  *context,const  char *message_array, unsigned  length)

SHA1Reset(SHA1Context *context)

  • soap_wsse_add_UsernameTokenText() 函数通过在SOAP请求中添加WS-Security的用户名令牌(Username Token)和密码来实现认证

涉及到内存分配、数据初始化和设置密码的过程,确保 UsernameToken 和 Password 被正确配置,以便用于认证

  • soap_wsse_add_UsernameTokenDigest_at() 函数为SOAP消息添加了包含Digest认证的用户名令牌

包括生成和编码 nonce、计算Digest、设置用户名令牌的各个字段,涉及生成安全认证所需的各种参数,并将它们正确地插入到SOAP请求中

  • soap_wsse_add_UsernameTokenDigest() 函数简化了 soap_wsse_add_UsernameTokenDigest_at() 的调用,默认使用当前时间生成用户名令牌的Digest认证

这使得调用者无需手动传入时间戳,简化了函数的使用

SOAP_FMAC1

int

SOAP_FMAC2

soap_wsse_add_UsernameTokenDigest(struct soap *soap, const char *id, const char *username, const char *password)

{

  return soap_wsse_add_UsernameTokenDigest_at(soap, id, username, password, time(NULL));

}

标签:IPC,const,--,add,soap,char,wsse,鉴权
From: https://blog.csdn.net/janet110617/article/details/141907103

相关文章

  • 场馆预定系统V1.2.2
    多场馆场地预定小程序,提供运动场馆运营解决方案,适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆V1.2.2修复已知bug场馆预定系统......
  • Maven超详细教程(二):Maven 生命周期管理详解
    Maven作为Java开发者广泛使用的项目管理工具,其核心特性之一就是其强大的生命周期管理。Maven生命周期定义了一系列有序的阶段(phases),每个阶段都可以绑定特定的插件(plugins)和目标(goals),以实现项目的构建、测试、打包、部署等任务。本文将详细梳理Maven的主要生命周期、各个......
  • 微型丝杆工艺流程!
    微型丝杆是一种高精度、高刚度的机械传动元件,广泛应用于各种领域。由于其精度要求高,制作过程需要经过多道工序的加工和检测,以下是微型丝杆工艺流程的简要概述:1、材料准备:根据微型丝杆的使用环境和性能要求,选择合适的材料,并对所选材料进行严格的质量检验,确保其符合生产要求,避免使用......
  • VBA信息获取与处理第三个专题第二节:工作簿和工作表模块代码(Workbook And Sheet Modul
    《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、......
  • 图形学学习(二):Shader输入输出及自制Shader类
    在LearnOpengl学了Shader的输入输出和自制Shader类,输入输出还是好理解的,自制Shader类的讲解我感觉还是用代码更直观一些(个人感觉),这两天看了一下秋招的面试面经,想了想明年找工作的问题,刺激,十分感慨,优秀的人还是太多了,不过最重要的还是得做好自己!!!Shader的输入输出总结有两种......
  • 海外盲盒APP系统开发,盲盒全球化发展机遇
    盲盒全球化近几年,盲盒在海外市场中迎来了爆发式增长,成为了一种新的潮流,拥有极高的人气,盲盒出海也已经成为了一个大风口,为我国盲盒市场带来了商业机遇!在盲盒出海的热潮下,海外盲盒APP系统也成为了连接海外消费者与盲盒企业的桥梁,为企业开拓海外市场提供助力,加速海外市场步伐。盲盒具......
  • 万字解析qinguoyi / TinyWebServer项目的源码
    前言项目地址项目详细介绍本文章适合刚学习完C++基础知识并尝试实现一个网络编程项目的同学,其中包含了该项目的代码逐行注释和解析以及许多刚学习网络编程中会遇到的疑问。项目简介:Linux下C++轻量级Web服务器,助力初学者快速实践网络编程,搭建属于自己的服务器.使用线......
  • 草料二维码功能上新!可以跨分区移动或复制内容了!
    支持将分区下的内容移动或复制到其他分区。适用于将原初始分区下的内容按业务划分,移动到其他分区。或者当物品流转或业务变更时,可以及时将码及数据移动到对应分区,移动后,二维码图案不会发生变化。目前仅表单、活码、批量模板、状态可跨分区移动/复制。只有账号下存在多分区时,弹窗......
  • (VUE查看三维CAD图纸)在线三维CAD中创建一个三维管道模型
    前言在网页CAD中进行三维建模是一项有趣的任务。本文将介绍如何利用mxcad3d来创建三维管道模型。该工具提供了一系列三维建模功能的API,使得建立复杂的管道结构变得简单直观。公众号:梦想云图网页CAD。安装在此之前,需要先安装mxcad包,安装的步骤可以查看梦想CAD官方的入门教程:https://......
  • 2024高教社杯数学建模国赛ABCDE题选题建议+初步分析
    提示:DSC君认为的难度:C<B<A,开放度:A<C<B。D、E题推荐选E题,后续会直接更新E论文和思路,不在这里进行选题分析,以下为A、B、C题选题建议及初步分析A题:“板凳龙”闹元宵A题是数模类赛事很常见的物理类赛题,需要学习不少相关知识。此题涉及对一个动态系统的建模,模拟一支舞龙队伍在......