Небольшая проблема и, возможно, более серьёзная:
В документации не упоминается обязательный параметр nonce:
def require_params
%i[public_key nonce scopes client_id application_name].each { |p| params.require(p) }
end
Теперь более сложная проблема. Discourse вызывает метод public_encrypt без аргументов:
Это означает, что аргумент padding по умолчанию принимает значение PKCS1_PADDING. Согласно документации Ruby:
Шифрует
stringс помощью открытого ключа. По умолчаниюpaddingравенPKCS1_PADDING, который считается небезопасным, но сохраняется для обратной совместимости.
К сожалению, Node v20.14.0 (текущая LTS) возвращает ошибку, если попытаться вызвать crypto.privateDecrypt с RSA_PKCS1_PADDING:
function decryptData(data: string, privateKey: string) {
const buffer = Buffer.from(data, "base64");
const decrypted = crypto.privateDecrypt(
{
key: privateKey,
padding: crypto.constants.RSA_PKCS1_PADDING,
},
buffer
);
return decrypted.toString("utf8");
}
TypeError: RSA_PKCS1_PADDING больше не поддерживается для расшифровки с закрытым ключом; это можно отменить с помощью флага --security-revert=CVE-2023-46809
Возможное решение для Node-приложений — запуск Node с небезопасным флагом:
node --security-revert=CVE-2023-46809
Исправление на стороне Discourse было бы простым, но, по всей видимости, это нарушит работу множества существующих интеграций:
public_key = OpenSSL::PKey::RSA.new(params[:public_key])
@payload = Base64.encode64(public_key.public_encrypt(@payload, OpenSSL::PKey::RSA::PKCS1_OAEP_PADDING))