6

私はソニーのカメラ SNC-CH110 を持っています。デフォルトのユーザーは「admin」で、パスワードも「admin」です。私の大きな問題は認証にあります。

<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

以下は、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 経由で取得) から日付、パスワード、ナンス、およびユーザー名を使用すると、成功することは非常に興味深いことです。しかし、このプログラムがパスワードをハッシュする方法がわかりません。仕様に従って正確に行っており、同じ日付、ノンス、およびパスワードを使用すると、このプログラムのように同じハッシュされたパスワードを取得できないためです。どんな助けにも感謝します、ありがとう。

4

2 に答える 2

4

ハッシュ計算は正しく見えますが、要素「Created」の名前空間が間違っていることがわかりました。これはwsu名前空間にあるはずです。
またhttp://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary、あなたの場合、値を使用してNonce要素の属性EncodingTypeを定義する方が正確です。

于 2012-04-11T21:05:49.970 に答える
0

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

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

于 2012-05-03T11:43:30.367 に答える