ONVIF GetDeviceInformation SOAP 消息

问题描述 投票:0回答:2

我正在尝试向符合 onvif 标准的相机发出网络请求,但我在响应时遇到问题。

我按照 ONVIF 应用程序员指南,想出了这个肥皂消息来获取设备信息:

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope 
    xmlns:s="http://www.w3.org/2003/05/soap-envelope" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:tt="http://www.onvif.org/ver10/schema" 
    xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
    xmlns:tds="http://www.onvif.org/ver10/device/wsdl">
    <s:Header>
        <wsse:Security>
            <wsse:Username>admin</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssusername-token-profile-1.0#PasswordDigest">
                WndlORLsIdMIyyvb99lzSgm0iGI=
            </wsse:Password>
            <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
                Rjc0QUUzNDI2MTMyMTI4OTJCQjI1QzM2RUEzMDUzNEUxMTlFNEQ2Mg==
            </wsse:Nonce>
            <wsu:Created>2017-05-11T11:48:56.8823852ZZ</wsu:Created>
        </wsse:Security>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl" />
    </s:Body>
</s:Envelope>

设备的响应是:

<SOAP-ENV:Envelope (...)>
    <SOAP-ENV:Header>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <SOAP-ENV:Fault>
            <SOAP-ENV:Code>
                <SOAP-ENV:Value>SOAP-ENV:Sender</SOAP-ENV:Value>
            <SOAP-ENV:Subcode>
                <SOAP-ENV:Value>ter:NotAuthorized</SOAP-ENV:Value>
            </SOAP-ENV:Subcode>
            </SOAP-ENV:Code>
            <SOAP-ENV:Reason>
                <SOAP-ENV:Text xml:lang="en">Sender not Authorized</SOAP-ENV:Text>
            </SOAP-ENV:Reason>
        </SOAP-ENV:Fault>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

我通过减去我的计算机和设备之间的偏移差来计算创建时间,以便使用与设备兼容的日期时间发送消息。

我的请求中是否遗漏了某些内容?考虑到用户名和密码是正确的,请问是什么原因导致这个问题呢?

xml soap httpwebrequest
2个回答
5
投票

因此,经过一些断断续续的研究和反复试验,我设法解决了我的问题。我使用wireshark检查Onvif设备管理器应用程序发送到相机的内容,并最终得到以下消息:

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <s:Header>
        <Security s:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <UsernameToken>
                <Username>admin</Username>
                <Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">6KZX13jsvYLOE72Fb7Nc4tCFE60=</Password>
                <Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">Xd0vNthkfp/VCmVtoHr3QA==</Nonce>
                <Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2017-06-01T10:29:01.001Z</Created>
            </UsernameToken>
        </Security>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl" />
    </s:Body>
</s:Envelope>

为了计算随机数和密码摘要,我还更改了我正在使用的方法并最终得到了这个:

public static void GetPasswordDigest(string ONVIFPassword, TimeSpan CameraTimeOffset, out string nonceb64_out, out string created_out, out string passwordDigest_out)
        {
            //Get nonce
            Random rnd = new Random();
            Byte[] nonce_b = new Byte[16];
            rnd.NextBytes(nonce_b);
            string nonce64 = Convert.ToBase64String(nonce_b);
            nonceb64_out = nonce64;

            //Get timestamp
            DateTime created = DateTime.UtcNow - CameraTimeOffset;
            string creationtime = created.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
            Byte[] creationtime_b = Encoding.ASCII.GetBytes(creationtime);
            created_out = creationtime;

            //Convert the plain password to bytes
            Byte[] password_b = Encoding.ASCII.GetBytes(ONVIFPassword);

            //Concatenate nonce_b + creationtime_b + password_b
            Byte[] concatenation_b = new byte[nonce_b.Length + creationtime_b.Length + password_b.Length];
            System.Buffer.BlockCopy(nonce_b, 0, concatenation_b, 0, nonce_b.Length);
            System.Buffer.BlockCopy(creationtime_b, 0, concatenation_b, nonce_b.Length, creationtime_b.Length);
            System.Buffer.BlockCopy(password_b, 0, concatenation_b, nonce_b.Length + creationtime_b.Length, password_b.Length);

            //Apply SHA1 on the concatenation
            SHA1 sha = new SHA1CryptoServiceProvider();
            Byte[] pdresult = sha.ComputeHash(concatenation_b);
            string passworddigest = Convert.ToBase64String(pdresult);
            passwordDigest_out = passworddigest;

        } 

此方法很大程度上基于其他人对 StackOverflow 中不同问题的回答,不幸的是我忘记保存链接或人名。 我希望这可以帮助那些与我遇到同样障碍的人。


2
投票

这仅适用于其他遇到类似问题的人。一般来说,特别是如果您不知道相机使用哪种身份验证方案,您应该发送

GetCapabilities
命令。它属于 PRE_AUTH 服务类,因此不需要任何身份验证,与其同伴
GetSystemDateAndTime
一样。响应包含一棵
Capabilities
树。转到
Device
节点。
Security
子项有关于相机支持的内容的描述。这些是真实相机拍摄的照片:

  1. “V380”、“YC365”、“EyePlus”部分型号:

      <tt:TLS1.1>false</tt:TLS1.1>
      <tt:TLS1.2>false</tt:TLS1.2>
      <tt:OnboardKeyGeneration>false</tt:OnboardKeyGeneration>
      <tt:AccessPolicyConfig>false</tt:AccessPolicyConfig>
      <tt:X.509Token>false</tt:X.509Token>
      <tt:SAMLToken>false</tt:SAMLToken>
      <tt:KerberosToken>false</tt:KerberosToken>
      <tt:RELToken>false</tt:RELToken>
      <tt:Extension>
         <tt:TLS1.0>false</tt:TLS1.0>
      </tt:Extension>
    
  2. “海康威视”、“博世摄像头”部分型号:

      <tt:TLS1.1>true</tt:TLS1.1>
      <tt:TLS1.2>true</tt:TLS1.2>
      <tt:OnboardKeyGeneration>false</tt:OnboardKeyGeneration>
      <tt:AccessPolicyConfig>false</tt:AccessPolicyConfig>
      <tt:X.509Token>false</tt:X.509Token>
      <tt:SAMLToken>false</tt:SAMLToken>
      <tt:KerberosToken>false</tt:KerberosToken>
      <tt:RELToken>false</tt:RELToken>
      <tt:Extension>
         <tt:TLS1.0>true</tt:TLS1.0>
      </tt:Extension>
    

第 2 部分中的摄像机不接受在 SOAP 信封标头中提供安全信息的请求。测试的模型需要 TLS。

ONVIF核心规范是一个重要的参考。

© www.soinside.com 2019 - 2024. All rights reserved.