2012-02-25 19 views
6

Ho una fotocamera SNC-CH110 di Sony. L'utente predefinito è "admin" e la password è "admin". Il mio grosso problema è con l'autenticazione.ONVIF: errore di autenticazione con SNC-CH110 tramite protocollo 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> 

Secondo specifica ONVIF 1.02, io uso “nome utente profilo del token” per l'autenticazione che è descritto nella specifica http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf o in http://www.onvif.org/Portals/0/documents/WhitePapers/ONVIF_WG-APG-Application_Programmer%27s_Guide.pdf

seguito la script che uso per formare richiesta sapone:

<?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>" 

Ecco il mio codice per la richiesta di invio:

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")); 

Sono davvero confuso, perché non riesco a trovare un errore. È molto interessante il fatto che quando uso data, password, nonce e username dal programma ONVIF Device Manager (l'ho preso tramite Wireshark), ho successo. Ma non capisco come questa password hash del programma, perché sto facendo esattamente secondo le specifiche e quando uso la stessa data, nonce e password non riesco a ottenere la stessa password hash come questo programma. Sarò grato per qualsiasi aiuto, grazie.

+0

Ho fatto una piccola funzione Java qualche tempo fa per calcolare e mostrare la parte Intestazione (solo un piccolo test). Ho testato il risultato usando SoapUI e una fotocamera Hikvision e ho funzionato perfettamente; Spero che aiuti: http://pastebin.com/x16Prr2J – pparescasellas

risposta

3

Il calcolo dell'hash è simile, ma ho trovato che l'elemento "Creato" ha uno spazio dei nomi errato, dovrebbe trovarsi nello spazio dei nomi wsu.
Inoltre, sarà più corretto definire l'attributo EncodingType per l'elemento Nonce con il valore http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary nel tuo caso.

+1

Ciao, grazie per rispondere. A proposito di spazi dei nomi, hai ragione. L'ho corretto qualche tempo fa. Ma non era un vero problema. Invia ws-usernametoken giusto. Ma ho appena cambiato leggermente il codice e si genera hash come quel programma che ho menzionato sopra, quindi corretto. Sono al momento impegnato, ma quando sarò libero, troverò quella presa e scriverò qui ciò che era un problema. – Hyen

0

Hai sincronizzato gli orologi tra te e la videocamera?
È necessario prima chiamare lo getSystemDateAndTime, registrare l'ora locale e, successivamente, utilizzare il diff tra i due quando si inviano ulteriori richieste.

getSystemDateAndTime non richiede l'autenticazione, quindi è chiaro a quel punto.

Problemi correlati