2012-02-25 9 views
6

Tengo la cámara SNC-CH110 de Sony. El usuario predeterminado es 'admin' y la contraseña es 'admin' también. Mi gran problema es con la autenticación.ONVIF: Error de autenticación con SNC-CH110 usando el protocolo ONVIF

<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:Detail> 
     <SOAP-ENV:Text xml:lang="en">The action requested requires authorization and the sender is not authorized 
     </SOAP-ENV:Text> 
    </SOAP-ENV:Detail> 
</SOAP-ENV:Fault> 

De acuerdo con la especificación ONVIF 1,02, utilizo “perfil de símbolo de nombre de usuario” para la autenticación que se describe en la especificación de http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf o en http://www.onvif.org/Portals/0/documents/WhitePapers/ONVIF_WG-APG-Application_Programmer%27s_Guide.pdf

continuación está la secuencia de comandos que utilizo para formar solicitud jabón:

<?xml version="1.0" encoding="utf-8"?> 
<SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" 
    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"> 
    <SOAP-ENV:Header> 
     <Security SOAP-ENV:mustUnderstand="1" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
      <UsernameToken> 
       <Username>admin</Username> 
       <wsse:Password Type=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wssusername-token-profile-1.0#PasswordDigest"">" + hashBase64 + @"</wsse:Password> 
       <wsse:Nonce >" + Convert.ToBase64String(_nonce) + @"</wsse:Nonce> 
       <Created>" + dt + @"</Created> 
      </UsernameToken> 
     </Security> 
    </SOAP-ENV:Header> 
    <SOAP-ENV:Body> 
     <tds:GetCapabilities> 
      <tds:Category>All</tds:Category> 
     </tds:GetCapabilities> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope>" 

Aquí está mi código de solicitud de envío:

byte[] _nonce = new byte[16]; 
RandomNumberGenerator rndGenerator = new RNGCryptoServiceProvider(); 
rndGenerator.GetBytes(_nonce); 

// get other operands to the right format 
string dt = DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ss.fffZ"); 
byte[] time = Encoding.UTF8.GetBytes(dt); 
byte[] pwd = Encoding.UTF8.GetBytes("admin"); 
byte[] operand = new byte[_nonce.Length + time.Length + pwd.Length]; 
Array.Copy(_nonce, operand, _nonce.Length); 
Array.Copy(time, 0, operand, _nonce.Length, time.Length); 
Array.Copy(pwd, 0, operand, _nonce.Length + time.Length, pwd.Length); 

// create the hash 
SHA1 sha1 = SHA1.Create(); 
string hashBase64 = Convert.ToBase64String(sha1.ComputeHash(operand)); 

XmlDocument xml = new XmlDocument(); 
xml.Load("../../../xml/GetCapabilities.xml"); 
Communication.SendTcpXml(xml.InnerXml, new Uri("http://192.168.1.25/onvif/device_service")); 

Estoy muy confundido, porque no puedo encontrar un error. Es muy interesante que cuando uso date, password, nonce y username del programa ONVIF Device Manager (lo tomé a través de Wireshark), tengo éxito. PERO no entiendo cómo este programa tiene contraseña, porque lo hago exactamente de acuerdo con la especificación y cuando uso la misma fecha, clave y contraseña no puedo obtener la misma contraseña hash como este programa. Estaré agradecido por cualquier ayuda, gracias.

+0

Hice una pequeña función de Java hace un tiempo para calcular y mostrar la parte del encabezado (solo una pequeña prueba). Probé el resultado usando SoapUI y una cámara Hikvision y funcioné perfectamente; Espero que ayude: http://pastebin.com/x16Prr2J – pparescasellas

Respuesta

3

El cálculo de hash se ve correctamente, pero encontré que el elemento "Creado" tiene un espacio de nombres incorrecto, debe estar en el espacio de nombres wsu.
También será más correcto definir el atributo EncodingType para el elemento Nonce con el valor http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary en su caso.

+1

Hola, gracias por responder. Acerca de los espacios de nombres, tienes razón. Lo corregí hace algún tiempo. Pero no fue un problema real. Envía ws-usernametoken a la derecha. Pero acabo de cambiar ligeramente el código y es generar hash como el programa que mencioné anteriormente, por lo que es correcto. Ahora mismo estoy ocupado, pero cuando sea libre, encontraré esa captura y la escribiré aquí, ¿cuál fue el problema? – Hyen

0

¿Ha sincronizado los relojes entre usted y la cámara?
Primero debe llamar al getSystemDateAndTime, registrar su hora local, y después de eso, usar la diferencia entre los dos al enviar más solicitudes.

getSystemDateAndTime no requiere autenticación, por lo que está claro en ese momento.

Cuestiones relacionadas