Php 如何计算wsse nonce?

Php 如何计算wsse nonce?,php,soap,ws-security,nonce,Php,Soap,Ws Security,Nonce,尝试向服务器发送soap请求(soapCall)时出错 Fatal error: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header 但是,我不太确定如何从php计算wsse nonce…有任何标准吗 我的密码 $nonce = sha1(mt_rand()); 结果 dabddf9dbd95b490ace

尝试向服务器发送soap请求(soapCall)时出错

Fatal error: Uncaught SoapFault exception: [ns1:InvalidSecurity] An error was discovered processing the <wsse:Security> header
但是,我不太确定如何从php计算wsse nonce…有任何标准吗

我的密码

$nonce = sha1(mt_rand());
结果

dabddf9dbd95b490ace429f7ad6b55c3418cdd58
NzJlMDQ4OTAyZWIxYWU5ZA==
这与示例完全不同……我相信这就是代码不起作用的原因

所以我正在做更多的研究,现在我正在使用这个

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

dabddf9dbd95b490ace429f7ad6b55c3418cdd58
NzJlMDQ4OTAyZWIxYWU5ZA==
现在,它看起来与示例相似,但我仍然从一开始就看到了错误

谁能帮我一下吗

一些关于soapUI的进一步测试

相同的userID和passwd,将passwordtype设置为passwordtext

它正在发挥作用

有人知道soapUI如何计算当前值吗?或者知道soapUI如何传递ws-security吗?

Microsoft将nonce定义为:

The nonce is 16 bytes long and is passed along as a base64 encoded value.
以下PHP代码生成的代码遵循Microsoft.Net WS-Security标准:

    $prefix = gethostname();
    $nonce = base64_encode( substr( md5( uniqid( $prefix.'_', true)), 0, 16));
一些没有$prefix的测试是成功的,但是该代码的生产版本使用$prefix,到目前为止没有遇到任何身份验证问题。此nonce代码的原始版本来自以下库(修改了substr中要返回的字符数):

试试这样的方法

        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);
    }
由于
uniqid()
基于伪随机数生成器,因此它没有提供足够的熵。锡耶

如果没有OpenSSL模块,请尝试将此回退到
mcrypt\u create\u iv()
请参阅:


我喜欢,但在PHP问题上,你会把kiddo's和C#混淆。lol。只是一个想法,而不是特定语言的解决方案。。。我希望它能帮助我用Java实现它。。它确实有效!因此,语言确实不那么重要,孩子们也很快乐;-)谢谢,但还是不走运,我还是无法连接到外部服务器。你能粘贴完整的错误吗?要快速测试证书是否是您的问题,请将
CURLOPT_SSL\u VERIFYPEER
设置为
FALSE
,然后发出cURL请求。你有权访问你的PHP日志吗?查看那里以了解更多信息。关于SSL有很多变量:SOAP服务器的SSL证书是否公开签名(StartSSL、GoDaddy等)?如果没有,您需要下载一个副本并在本地安装。
phpinfo()
是否报告已安装OpenSSL?如果您使用的是Windows,您是否正确安装了cURL/OpenSSL()的CA捆绑包?您解决了这个问题吗?除了$dateCreated=date('Y/m/d H:I:s')之外,我还遇到了相同的问题$nonce=base64_编码(sha1((mt_rand().$dateCreated.self::PASSWORD));
$nonce = base64_encode( bin2hex( openssl_random_pseudo_bytes( 16 ) ) );