【问题标题】:openssl_sign(): supplied key param cannot be coerced into a private keyopenssl_sign():提供的密钥参数不能被强制转换为私钥
【发布时间】:2014-03-24 12:09:42
【问题描述】:

我已经用谷歌搜索这些问题的答案。但我无法为我的问题找到合适的解决方案,因为许多答案都是针对问题相关的。

当我尝试使用 XMLSecurityKeyopenssl_sign 创建内容的数字签名时,我收到警告并且未创建签名。

openssl_sign 抛出错误:

Warning: openssl_sign(): supplied key param cannot be coerced into a private key in /var/www/git/ta_client/accessService.php on line 105

我的代码是:

public function _signMessage($encData, $configValues)
    {
$decode = 'decode';
    $token = $encData['token'];
    $cipherValue = $encData['cipherValue'];
    $clientId = $encData['ClientId'];
    $grpCustNum = $encData['grpCustNum'];

    // Sign the concatenated string
    $toSign = $token . $cipherValue . $clientId . $grpCustNum;

    // Encrypt the token with the public key from vendor
    $cipher = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private')); // Reference to XMLSecLibs
    $cipher->loadKey($configValues['privkey'], true);
    try{
    if (! openssl_sign ($toSign, $signature, $cipher->key, OPENSSL_ALGO_MD5)) {
        openssl_error_string();
        throw new Exception();
    }
    }catch(Exception $e){
    print_r($e);
    die;
}
    // append the decode values
    $encData['sign'] = urlencode(base64_encode($signature)) . $decode;
    $encData['token'] = urlencode($token) . $decode;
    $encData['cipherValue'] = urlencode($cipherValue) . $decode;

    return $encData;
}

我的$configValues['privkey'] 是xml 格式。有什么建议吗?

【问题讨论】:

    标签: openssl rsa digital-signature php-openssl


    【解决方案1】:

    openssl 不支持 XML 格式。我的建议是使用 phpseclib。即。

    <?php
    include('Crypt/RSA.php');
    
    $rsa = new Crypt_RSA();
    $rsa->loadKey('...'); // private key
    
    $plaintext = '...';
    
    $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
    $signature = $rsa->sign($plaintext);
    

    我假设您尝试加载的私钥是这种格式?:

    <RSAKeyValue>
      <Modulus>AKoYq6Q7UN7vOFmPr4fSq2NORXHBMKm8p7h4JnQU+quLRxvYll9cn8OBhIXq9SnCYkbzBVBkqN4ZyMM4vlSWy66wWdwLNYFDtEo1RJ6yZBExIaRVvX/eP6yRnpS1b7m7T2Uc2yPq1DnWzVI+sIGR51s1/ROnQZswkPJHh71PThln</Modulus>
      <Exponent>AQAB</Exponent>
      <P>AN4DDp+IhBca6QEjh4xlm3iexzLajXYrJid6vdWmh4T42nar5nem8Ax39o3ND9b1Zoj41F9zFQmuZ8/AgabreKU=</P>
      <Q>AMQi+R0G9m0K+AcqK3DFpv4RD9jGc0Tle98heNYT7EQvZuuiq4XjvRz0ybqN//bOafrKhsTpRS9DQ7eEpKLI4Bs=</Q>
      <DP>FklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5kX6zk7S0ljKtt2jny2+00VsBerQ==</DP>
      <DQ>AJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2eplU9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhM=</DQ>
      <InverseQ>EaiK5KhKNp9SFXuLVwQalvzyHk0FhnNZcZnfuwnlCxb6wnKg117fEfy91eHNTt5PzYPpf+xzD1FnP7/qsIninQ==</InverseQ>
      <D>Fijko56+qGyN8M0RVyaRAXz++xTqHBLh3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxE=</D>
    </RSAKeyValue>
    

    【讨论】:

    • 是的。我的私钥格式相同。感谢您的回复。
    【解决方案2】:

    如果您使用格式错误的私钥或尝试使用公钥签名,也会产生同样的错误...

    【讨论】:

      【解决方案3】:

      此错误消息有多种原因,可能极具误导性!

      当然,如果您的 PEM 文件因某种原因损坏或显然不包含私钥,则会出现此错误消息。

      但是当文件根本无法读取时也会出现此错误消息,例如因为没有权限。不幸的是,消息没有提到这一点。

      【讨论】:

        猜你喜欢
        • 2019-05-29
        • 2023-03-16
        • 2021-03-01
        • 2014-02-04
        • 2014-12-11
        • 1970-01-01
        • 2016-04-02
        • 1970-01-01
        • 2013-07-17
        相关资源
        最近更新 更多