PHP肥皂填充标题凭据

时间:2017-04-19 11:28:49

标签: php soap openssl

我通过Soap连接到网络服务,我需要填写标头凭据才能登录。

$user_id        = 'MyUserId';
$unique_key     = $this->getUniqueKey();
$base_password  = $this->getFieldBase('MyPassword', $uniqueKey);
$base_date      = $this->getFieldBase(gmdate('Y-m-d\TH:i:s\.00\Z'), $unique_key);
$nonce          = $this->getFieldNonce($unique_key, '.myPemFile.pem');

<wss:UsernameToken>
    <wss:Username>' . $user_id . '</wss:Username>
    <wss:Password>' . $base_password . '</wss:Password>
    <wss:Nonce>' . $nonce . '</wss:Nonce>
    <wss:Created>' . $base_date . '</wss:Created>
</wss:UsernameToken>

所有值(用户名除外)都遵循结构。

enter image description here enter image description here enter image description here

我有一个5.6 PHP项目,但现在我需要将它改编为PHP 7项目,这意味着我不能再使用mcrypt_encrypt(),因为它已被弃用,因此我需要使用openssl_encrypt()

我目前的职能是:

private function getFieldBase($data, $key)
{
    $ivsize         = openssl_cipher_iv_length('AES-128-ECB');
    $iv             = openssl_random_pseudo_bytes($ivsize);
    $ciphertext     = openssl_encrypt($data, 'AES-128-ECB', $key, 0, $iv);  

    return trim(base64_encode($ciphertext));
}

private function getFieldNonce($data, $pbkey)
{
    openssl_public_encrypt($data, $crypttext, openssl_pkey_get_public(file_get_contents($pbkey)));

    return base64_encode($crypttext);
}

private function getUniqueKey() 
{
   return substr(md5(uniqid(microtime())), 0, 16);
}

问题是当连接到Webservice时,我收到错误:

  

拒绝:错误:密钥会话无效。它不是   可以破译创建的字段

这告诉我我的getFieldBase()功能是错误的。

1 个答案:

答案 0 :(得分:1)

<强>解决

参数RAW_OUTPUT必须在函数openssl_encrypt中为真。

private function getFieldBase($data, $key)
{
    $ivsize     = openssl_cipher_iv_length('AES-128-ECB');
    $iv         = openssl_random_pseudo_bytes($ivsize);
    $ciphertext = openssl_encrypt($data, 'AES-128-ECB', $key, TRUE, $iv);   

    return base64_encode($ciphertext);
}