#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 в виде строки или буфера.