Эквивалент PHP openssl_sign в Node JS - PullRequest
0 голосов
/ 24 августа 2018

Я (медленно) изучаю Node JS и пытаюсь использовать его вместо имеющегося у меня PHP-скрипта.Мне нужно подписать строку, которую я собрал, с помощью SSL, чтобы передать запрос curl.

В PHP вот как я это сделал:

$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, но я не уверен, что делать дальше,Кажется, что Node's 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 Ответ

0 голосов
/ 26 августа 2018

Используя вашу работу в качестве отправной точки и внося незначительные изменения, следующие фрагменты приводят к печати одной и той же подписи (в кодировке base64):

PHP:

$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 -ing два:

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

показывает, что выходы одинаковы.

Я использовал этот ресурс: iotdb-crypto-пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...