невозможно создать подпись с использованием cryto в nodejs

#javascript #node.js #rsa #sha256

#javascript #node.js #rsa #sha256

Вопрос:

Я пытаюсь создать подпись с использованием алгоритма RSA-SHA25. Это приведенный ниже код

 const data = "My data";    
const sign = crypto.createSign("RSA-SHA256");
sign.update(Buffer.from(data, "utf8"));
signature = sign
  .sign({ key: privateKey, padding: crypto.constants.RSA_PKCS1_PSS_PADDING })
  .toString("base64");
  

Проблема в том, что я получаю эту ошибку. Я искал в Интернете, но не смог найти правильное решение.

internal/crypto/sig.js:105 const ret = this[kHandle].sign(данные, формат, тип, кодовая фраза, повторное добавление, ^

Ошибка: ошибка: 0909006C: процедуры PEM: get_name: нет начальной строки

Ответ №1:

В опубликованном коде NodeJS ключ передается как объект, поэтому в общем случае свойства key , format и type должны использоваться для описания ключа, что подробно объясняется в документации sign.sign(privateKey[, outputEncoding]) и crypto.createPrivateKey(key) .

Здесь key содержится ключевой материал, format указывается кодировка ( 'pem' или 'der' , где 'pem' по умолчанию) и type тип (для RSA это может быть 'pkcs1' или 'pkcs8' , где этот параметр требуется, только если format равно 'der' ).

Если эти свойства несовместимы, обычно возникает ошибка.

Например, в случае опубликованного кода, format явно не указано, поэтому используется значение по умолчанию 'pem' . Если ключ privateKey является ключом в DER-кодировке (в буфере), возникает несоответствие, которое приводит к сообщению об ошибке Ошибка: ошибка: 0909006C: PEM routines:get_name: отсутствует начальная строка: Из-за неявно указанного format 'pem' ожидается ключ в PEM-кодировке с соответствующим заголовком, который отсутствует для ключа в DER-кодировке, что приводит к ошибке. Решение состоит в том, чтобы явно указать format и type , например:

 { key: privateKey, format: 'der', type: 'pkcs8', padding: crypto.constants.RSA_PKCS1_PSS_PADDING }
  

для ключа PKCS # 8 (или 'pkcs1' для ключа PKCS # 1).

И наоборот, для

 { key: privateKey, padding: crypto.constants.RSA_PKCS1_PSS_PADDING }
  

privateKey должен быть ключ в кодировке PEM в виде строки или буфера.