Пакет NPM `pem`, похоже, не работает в лямбда-ноте AWS NodeJS 10.x (приводит к ошибке OpenSSL) - PullRequest
3 голосов
/ 24 октября 2019

Когда я запускаю функцию локально на NodeJS 11.7.0, она работает, когда я запускаю ее на AWS Lambda NodeJS 8.10, она работает, но я недавно пытался запустить ее на AWS Lambda NodeJS 10.x и получить этот ответ и эту ошибку в Cloud Watch,

Есть мысли о том, как это исправить?

Ответ

{
    "success": false,
    "error": "Error: Could not find openssl on your system on this path: openssl"
}

Ошибка Cloudwatch

ERROR (node:8) [DEP0005] DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from() methods instead.

Функция

...
const util = require('util');
const pem = require('pem');
...

return new Promise((fulfill) => {
        require('./certs').get(req, res, () => {
            return fulfill();
        });
    }).then(() => {
        const createCSR = util.promisify(pem.createCSR);

        //This seems to be where the issue is coming from 
        return createCSR({
            keyBitsize: 1024,
            hash: HASH,
            commonName: id.toString(),
            country: 'US',
            state: 'Maryland',
            organization: 'ABC', //Obfuscated 
            organizationUnit: 'XYZ', //Obfuscated
        });
    }).then(({ csr, clientKey }) => {
        ...
    }).then(async ({ certificate, clientKey }) => {
        ...
    }, (err) => {
        return res.status(404).json({
            success: false,
            error: err,
        });
    });
...

Я пробовал с "pem": "^1.14.3", и "pem": "^1.14.2",

Ответы [ 3 ]

1 голос
/ 25 октября 2019

https://github.com/lambci/git-lambda-layer/issues/13#issue-444697784 (электронное письмо с уведомлением)

Кажется, openssl было удалено во время выполнения nodejs10.x.

Я снова проверил на lambci/lambda:build-nodejs10.x образ докера иподтвердил это. Возможно, вам нужно изменить версию во время выполнения или найти другой путь на createCSR.

which: no openssl in (/var/lang/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin)
1 голос
/ 24 октября 2019

Документация PEM NPM гласит:

Настройка местоположения openssl В некоторых системах исполняемый файл openssl может быть недоступен по умолчанию или не включен в $ PATH. В этом случае вы можете определить местоположение исполняемого файла самостоятельно как одноразовое действие после загрузки модуля pem:

Так что я думаю, что он не может найти путь OpenSSL в системе, которую вы можете попробоватьнастройте его программно:

var pem = require('pem')
pem.config({
  pathOpenSSL: '/usr/local/bin/openssl'
}) 

Поскольку вы используете AWS Lambda, просто попробуйте напечатать process.env.path, вы получите представление о том, включен ли OpenSSL в переменную path env или нет.

Вы можететакже проверьте 'OpenSSL', выполнив код ниже

const exec = require('child_process').exec;
exec('which openssl',function(err,stdopt,stderr){
      console.log(err ? err : stdopt);    
})

UPDATE

Как упомянуто в своем ответе @hoangdv, openssl, похоже, удален для среды выполнения node10.x иЯ думаю, он прав. Кроме того, у нас есть доступ только для чтения к файловой системе, поэтому мы ничего не можем сделать.

@ Сет МакКлейн, вы можете попробовать модуль node-forge npm. Один из модулей, построенный поверх этого, - 'https://github.com/jfromaniello/selfsigned', который облегчит вашу задачу

0 голосов
/ 28 октября 2019

Что вы можете сделать, это создать лямбда-слой с библиотекой openssl. Используя lambdaci / lambda: build-nodejes10.x, вы можете скомпилировать библиотеку openssl и создать zip-файл из установки. Этот zip-файл можно использовать в качестве слоя для лямбды.

Создайте файл с именем create-openssl-zip.sh и убедитесь, что chmod u + x it.

#!/bin/bash -x

# This file should be run inside the lambci/lambda:build-nodejs10.x container
yum update -y
yum install autoconf bison gcc gcc-c++ libcurl-devel libxml2-devel -y
curl -sL http://www.openssl.org/source/openssl-1.1.1d.tar.gz | tar -xvz
cd openssl-1.1.1d
./config --prefix=/var/task/nodejs/openssl --openssldir=/var/task/nodejs/openssl && make && make install
cd /var/task/
zip -r lambda-openssl-layer.zip nodejs
cp lambda-openssl-layer.zip /opt/layer/

Затем выполните:

docker run -it -v `pwd`:/opt/layer lambci/lambda:build-nodejs10.x /opt/layer/create-openssl-zip.sh

Это запустит скрипт внутри контейнера докера, и когда это будет сделано, у вас будет файл с именем lambda-openssl-layer.zip в вашем текущем каталоге.

Загрузите эту лямбду в корзину s3 и создайтелямбда-слой. На вашей исходной лямбде добавьте этот слой и измените свой код так, чтобы библиотека PEM знала, где искать библиотеку OpenSSL, следующим образом:

PEM.config({
  pathOpenSSL: '/opt/nodejs/openssl/bin/openssl'
})

И, наконец, добавьте дополнительную переменную среды в вашу лямбду, называемую LD_LIBRARY_PATH со значением /opt/nodejs/openssl/lib

В противном случае произойдет сбой с: /opt/nodejs/openssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

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