2012-02-25 26 views
6

ソニーのカメラSNC-CH110を使用しました。デフォルトのユーザーは「admin」、パスワードは「admin」です。私の大きな問題は認証です。ONVIF:ONVIFプロトコルを使用したSNC-CH110の認証に失敗しました

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

はONVIF仕様1.02によれば、私は仕様http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdfまたは以下http://www.onvif.org/Portals/0/documents/WhitePapers/ONVIF_WG-APG-Application_Programmer%27s_Guide.pdf

Iは、SOAP要求を形成するために使用するスクリプトであるに記載されている認証用の「ユーザ名トークンプロファイル」を使用しますここで

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

は、要求を送信するために私のコードです:

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

私は間違いを見つけることができないので、私は本当に混乱しています。非常に面白いことに、プログラムONVIF Device Managerから日付、パスワード、ノンス、ユーザー名を使用すると(Wireshark経由で)、成功です。しかし、私はこのプログラムのハッシュパスワードの仕方を理解していません。なぜなら、私は仕様に従って正確にやっているからです。同じ日付、ノンスとパスワードを使用すると、このプログラムのように同じハッシュパスワードを得ることができません。助けてくれてありがとう、ありがとう。

+0

少し前に少しのJava関数を作って、ヘッダ部分を計算して表示しました(ちょっとしたテスト)。私はSoapUIとHikvisionカメラを使ってその結果をテストし、完璧に働いた。私はそれが助けてくれることを願っています:http://pastebin.com/x16Prr2J – pparescasellas

答えて

3

ハッシュ計算は正しく見えますが、 "Created"という要素が間違った名前空間を持っていることがわかりました。wsu名前空間にあるはずです。
あなたのケースでは、値http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64BinaryのNonce要素の属性EncodingTypeをさらに正しく定義することができます。

+1

こんにちは。名前空間については、あなたが正しいです。私はしばらく前に修正しました。しかしそれは本当の問題ではなかった。 ws-usernametokenが正しく送信されます。しかし、コードを少し変更しただけで、上で述べたプログラムのようにハッシュを生成するので、正しいです。私は今は忙しいですが、私が自由になると、私はその漁獲物を見つけ出し、問題が何であったのかここに書きます。 – Hyen

0

あなたとカメラの間で時計を同期しましたか?
最初にgetSystemDateAndTimeに電話をかけ、現地時間を記録してから、さらにリクエストを送信するときにその2つの間のdiffを使用する必要があります。

getSystemDateAndTimeは認証を必要としないため、その時点で明確です。

関連する問題