5

SOAP 要求 (soapCall) をサーバーに送信しようとしているときにエラーが発生しました。

Fatal error: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header

ws-security ヘッダーを送信する必要があります

<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">

<wsse:UsernameToken wsu:Id="UsernameToken-1" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">

<wsse:Username>userID</wsse:Username>

<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">passwd</wsse:Password>

<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">ZTQ3YmJjZmM1ZTU5ODg3YQ==</wsse:Nonce>

<wsu:Created>2013-07-05T19:55:36.458Z</wsu:Created>

</wsse:UsernameToken>
</wsse:Security>

多くの調査の後、私が得た問題は、ノンスが要件を満たしていないことだと思います。私が作成しているように、石鹸ヘッダーは私が得た例のように見えます。唯一の未知の要素は、このナンスを計算することです...

私が得たナンスの例から、24個の数字+アルファベット+特殊文字のセットです

このようなもの

ZTQ3YmJjZmM1ZTU5ODg3YQ==

しかし、しかし、php から wsse nonce をどのように計算するのかよくわかりません...標準はありますか?

私が持っていたコード

$nonce = sha1(mt_rand());

結果

dabddf9dbd95b490ace429f7ad6b55c3418cdd58

これは例とはまったく異なるものです...そして、これがこのコードが機能しない理由だと思います。

だから私はもっと研究をしていて、今はこれを使っています

$NASC = substr(md5(uniqid('the_password_i_am _using', true)), 0, 16);
$nonce = base64_encode($NASC); 

結果

NzJlMDQ4OTAyZWIxYWU5ZA==

今、それは例に似ていますが、最初からエラーが表示されています。

誰か手を貸してくれませんか?

soapUI を使用したさらにいくつかのテスト。

同じユーザー ID と passwd、passwordtype を passwordtext に設定します

そしてそれは働いています。

soapUI がナンスを計算する方法を知っている人はいますか? または、soapUI が ws-security を渡す方法を知っていますか?

4

3 に答える 3

9

このようなことを試してください

        string usn = "MyUsername";
        string pwd = "MyPassword";

        DateTime created = DateTime.Now.ToUniversalTime();
        var nonce = getNonce();
        string nonceToSend = Convert.ToBase64String(Encoding.UTF8.GetBytes(nonce));
        string createdStr = created.ToString("yyyy-MM-ddTHH:mm:ssZ");
        string passwordToSend = GetSHA1String(nonce + createdStr + pwd);

および機能:

protected string getNonce()
    {
        string phrase = Guid.NewGuid().ToString();
        return phrase;

    }

    protected string GetSHA1String(string phrase)
    {
        SHA1CryptoServiceProvider sha1Hasher = new SHA1CryptoServiceProvider();
        byte[] hashedDataBytes = sha1Hasher.ComputeHash(Encoding.UTF8.GetBytes(phrase));
        string test = Convert.ToString(hashedDataBytes);
        return Convert.ToBase64String(hashedDataBytes);
    }
于 2013-09-21T12:29:43.340 に答える
2

uniqid()疑似乱数ジェネレーターに基づいているため、十分なエントロピーが得られません。ランダム値の不十分なエントロピー

$nonce = base64_encode( bin2hex( openssl_random_pseudo_bytes( 16 ) ) );

OpenSSL モジュールがない場合は、このフォールバックを試して次をmcrypt_create_iv()確認してください。

https://github.com/padraic/SecurityMultiTool/blob/master/library/SecurityMultiTool/Random/Generator.php

于 2015-07-03T12:19:11.903 に答える
0

Microsoft は、WS-Securityナンスを次のように定義しています。

The nonce is 16 bytes long and is passed along as a base64 encoded value.

次の PHP コードは、Microsoft .Net WS-Security Standard に準拠したコードを生成します。

    $prefix = gethostname();
    $nonce = base64_encode( substr( md5( uniqid( $prefix.'_', true)), 0, 16));

$prefix を使用しない一部のテストは成功しましたが、このコードの製品版では $prefix を使用しており、これまでのところ認証の問題は発生していません。この nonce コードの元のバージョンは、次のライブラリから取得されました (substr で返される文字数が変更されています): http://code.ronoaldo.net/openemm/src/e25a2bad5aa7/webservices/WSSESoapClient.php#cl -267

于 2013-09-03T17:15:00.853 に答える