代码之家  ›  专栏  ›  技术社区  ›  Clifton Labrum

节点JS中PHP的openssl_符号等价物

  •  1
  • Clifton Labrum  · 技术社区  · 7 年前

    我正在(慢慢地)学习Node JS,并试图用它代替我拥有的PHP脚本。我需要签署一个用SSL组装的字符串,以传递给 curl 请求。

    $sig = '2018-08-24T17:33:41Z:abcdef:/path/to/api';
    
    $pkeyid = openssl_pkey_get_private("file://YourMomGoesToCollege.pem"); 
    
    // Sign 'sig' with private key
    if(openssl_sign($sig, $signed_signature, $pkeyid, "sha256WithRSAEncryption")) {
    
      openssl_free_key($pkeyid);
    
      //Set curl header options ...
      curl_setopt($ch, CURLOPT_HTTPHEADER,
        [
        "X-Apple-CloudKit-Request-SignatureV1: " . base64_encode($signed_signature),
      ]
    );
    
    }
    

    所以我试着创造出 $signed_signature ,但我不知道如何继续。好像诺德的 Crypto

    const crypto = require('crypto')
    const sign = crypto.createSign('SHA256')
    
    sign.write(sig)
    sign.end()
    
    const privateKey = __dirname + 'YourMomGoesToCollege.pem'
    var signedSignature = sign.sign(privateKey, 'hex')
    
    var readyForCurl = Buffer.from(signedSignature).toString('base64')
    

    我走对了吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Reinier Torenbeek    7 年前

    菲律宾比索:

    $data = 'some data to sign';
    $key = openssl_pkey_get_private('file://private.pem'); 
    
    if(openssl_sign($data, $signature, $key, 'sha256WithRSAEncryption')) {
      openssl_free_key($key);
      $signature_b64 = base64_encode($signature);
      echo($signature_b64."\n");
    }
    

    节点JS:

    const crypto = require('crypto');
    const sign = crypto.createSign('SHA256');
    const fs = require('fs')
    
    sign.write('some data to sign');
    sign.end();
    
    const key = fs.readFileSync('private.pem');
    signature_b64 = sign.sign(key, 'base64');
    console.log(signature_b64);
    

    diff -两个方面:

    $ diff <(php sign.php) <(node sign.js)
    

    我使用了这个资源: iotdb-crypto-example

    推荐文章