EXp*_*rld 4 php ws-security soap nonce
我在尝试向服务器发送soap请求(soapCall)时收到错误.
Fatal error: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header
Run Code Online (Sandbox Code Playgroud)
我需要发送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>
Run Code Online (Sandbox Code Playgroud)
经过大量的研究后,我认为我得到的问题是nonce没有达到要求.正如我正在编制肥皂标题看起来像我得到的例子.唯一未知的因素是计算这个随机数......
从我得到的示例nonce,它是一组24个数字+字母+特殊字符
像这样的东西
ZTQ3YmJjZmM1ZTU5ODg3YQ==
Run Code Online (Sandbox Code Playgroud)
但是,我不太确定你如何从php计算wsse nonce ...有什么标准吗?
我的代码
$nonce = sha1(mt_rand());
Run Code Online (Sandbox Code Playgroud)
结果
dabddf9dbd95b490ace429f7ad6b55c3418cdd58
Run Code Online (Sandbox Code Playgroud)
这与示例完全不同......我相信这就是为什么这段代码无效的原因.
所以我正在做更多的研究,现在我正在使用它
$NASC = substr(md5(uniqid('the_password_i_am _using', true)), 0, 16);
$nonce = base64_encode($NASC);
Run Code Online (Sandbox Code Playgroud)
结果
NzJlMDQ4OTAyZWIxYWU5ZA==
Run Code Online (Sandbox Code Playgroud)
现在,它看起来类似于示例,但我仍然从头开始显示该错误.
有人可以帮我一把吗?
用soapUI进行一些进一步测试.
相同的userID和passwd,将passwordtype设置为passwordtext
它正在发挥作用.
有谁知道soapUI如何计算nonce?或者知道soapUI如何通过ws-security?
尝试这样的事情
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);
Run Code Online (Sandbox Code Playgroud)
和功能:
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);
}
Run Code Online (Sandbox Code Playgroud)
Microsoft 将WS-Security随机数定义为:
The nonce is 16 bytes long and is passed along as a base64 encoded value.
Run Code Online (Sandbox Code Playgroud)
以下 PHP 代码生成遵循 Microsoft .Net WS-Security 标准的代码:
$prefix = gethostname();
$nonce = base64_encode( substr( md5( uniqid( $prefix.'_', true)), 0, 16));
Run Code Online (Sandbox Code Playgroud)
一些没有 $prefix 的测试是成功的,但此代码的生产版本使用 $prefix ,到目前为止没有遇到身份验证问题。此随机数代码的原始版本来自以下库(对 substr 中返回的字符数进行了修改): http://code.ronoaldo.net/openemm/src/e25a2bad5aa7/webservices/WSSESoapClient.php#cl -267
归档时间: |
|
查看次数: |
15827 次 |
最近记录: |