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.
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