Как подписать базовую строку для OAuth 1.0 с помощью RSA-SHA1?

#ruby #typescript #oauth #cryptography #oauth-1.0a

Вопрос:

Я пытаюсь реорганизовать устаревший клиент Ruby OAuth1.0 в TypeScript. (К сожалению, в данный момент я не могу обновить сервер до OAuth2.0). Параметры запроса подписываются с помощью RSA-SHA1 закрытого ключа RSA.

Это устаревший код Ruby:

 @consumer = OAuth::Consumer.new(credentials[:consumer_key], credentials[:private_key], site: credentials[:base_uri], signature_method: 'RSA-SHA1')
token = OAuth::AccessToken.new(@consumer, credentials[:access_token], credentials[:access_token_secret])
 

Это код TS, использующий https://github.com/rzcoder/node-rsa:

Изменить: После просмотра спецификации я явно добавил тип ключа — pkcs1-private .

 const oauth = new OAuth({
        consumer,
        version: '1.0',
        signature_method: 'RSA-SHA1',
        hash_function: (baseString, key) => {
            const nPrivateKey = new NodeRSA(privateKey, 'pkcs1-private');
            return nPrivateKey.encrypt(baseString, 'base64');
        },
    })
 

Это проверочный код PHP-сервера:

 $decodedSignature = base64_decode($request->urldecode($signature));
$certificate = $this->getPublicCertificate($request);
$publicKeyId = openssl_get_publickey($certificate);
$isValid = openssl_verify($baseString, $decodedSignature, $publicKeyId);
 

При отладке на сервере проверка OpenSSL с помощью открытого ключа не совпадает.

С возможными комбинациями кодирования, различными ключами и алгоритмами я не уверен, как это отладить/протестировать.

Есть какие-нибудь идеи?