#node.js #https #openssl #cryptojs #hapijs
Вопрос:
Мы попытались установить наш веб-сервис Hapis (версия Nodejs 14) на сервер нашего клиента. Он работал по протоколу HTTP в течение нескольких месяцев, но когда мы включили HTTPS с соответствующими путями к сертификату и ключу, произошел сбой при запуске службы с:
ошибка:06065064:процедуры цифрового конверта:EVP_Decryptfinal_ex:неверная расшифровка
Их сертификат и ключ генерируются с помощью онлайн-портала Venafi. Это дало им элт и ключ. Crt использует алгоритм подписи: sha256RSA, алгоритм хэширования подписи sha256 и алгоритм отпечатка пальца: sha1.
Кроме того, закрытый ключ является ЗАКРЫТЫМ КЛЮЧОМ RSA с типом Proc: 4,ЗАШИФРОВАННЫМ и информацией DEK: DES-EDE3-CBC.
Я не уверен, что происходит, потому что HTTPS отлично работает на наших серверах разработки.
- Есть ли проблема в HapiJS?
- Проблема в самом сертификате или ключе?
- Есть ли опция узла, которую я должен передать при создании службы?
Пожалуйста, помогите.
Комментарии:
1. Эта ошибка обычно, если не всегда, возникает из-за предоставления неверной кодовой фразы для расшифровки (закрытого)ключа. Проверьте это и избегайте символов, отличных от ASCII. Вам неясно, являются ли это одни и те же файлы (и вы могли бы протестировать их локально), хотя я надеюсь, что нет, потому что вы не сможете доказать право собственности на их доменное имя или наоборот. (Если на то пошло, использование какого-то неизвестного онлайн-источника-плохая практика безопасности, но это в любом случае выходит за рамки вашего вопроса и не входит в тему.)
2. Спасибо, сэр. Я обновил вопрос, указав подробную информацию о элт и ключе. Я не указываю кодовую фразу, так как не думал, что мне это нужно, потому что мне никогда не приходилось этого делать в нашей тестовой среде.
3. Да, этот ключевой файл зашифрован парольной фразой, она же пароль, поэтому вам необходимо указать парольную фразу, используя параметр парольной фразы для tls.createSecureContext (который используется https ниже). В качестве альтернативы, если это приемлемо для пользователей и любых применимых политик или правил, используйте openssl командной строки для преобразования зашифрованного файла ключа в незашифрованный, тогда вам не нужна никакая кодовая фраза.
4. Ого, это сработало. Большое вам спасибо!!!
5. Если вы переместите свой комментарий на панель ответов, я отмечу его как таковой
Ответ №1:
Указанная ошибка 06065064:digital envelope routines:EVP_Decryptfinal_ex:bad decrypt
возникает в соединении SSL/TLS с использованием OpenSSL (что на самом деле используют модули nodejs, такие как tls и https), когда privatekey зашифрован (с помощью парольной фразы) и для его расшифровки не указана правильная парольная фраза. Описанный формат файла, начинающийся со строки -----BEGIN RSA PRIVATE KEY-----
, за которой следуют строки Proc-Type:
, и DEK-Info:
действительно является одним из зашифрованных форматов, используемых OpenSSL. В частности, это зашифрованный «традиционный» или «устаревший» формат; формат PKSC8 добавил около 2000, но все еще считается новым(!) использует -----BEGIN ENCRYPTED PRIVATE KEY-----
и не использует заголовки в стиле 822, только base64 (зашифрованной структуры, определенной PKCS8); см. ursinely-подробный https://security.stackexchange.com/questions/39279/stronger-encryption-for-ssh-keys/#52564 об использовании OpenSSH OpenSSL, которое в основном совпадает с использованием nodejs.
tls
Модуль и другие , которые на нем основаны, в том числе https
, в конечном счете, считывают ключи и сертификаты, с помощью tls.createSecureContext
которых принимается options
участник passphrase
, или, если вам нужно использовать несколько ключей(и сертификатов), вы можете указать кодовую фразу для каждого ключа, как описано в связанном документе.
В качестве альтернативы вы можете избежать необходимости в парольной фразе, преобразовав ключ в незашифрованный файл, если это допустимо в соответствии с применимыми политиками и правилами безопасности. (Хорошие политики могут запретить это, но они обычно также запрещают получать приватный ключ или предоставлять его в любую другую систему, особенно в «онлайн» где-то, и ваш клиент делает последнее.) Чтобы сохранить традиционный формат, сделайте
openssl rsa -in oldfile -out newfile
# and give the passphrase when prompted, or see the man page about -passin
или вы можете использовать «новый» формат PKCS8 с
openssl pkey -in oldfile -out newfile
# technically only in release 1.0.0 up, but pretty much everyone is there now
#
# or in all versions back to about 2000
openssl pkcs8 -topk8 -nocrypt -in oldfile -out newfile
Ответ №2:
Для меня эта ошибка возникла после того, как я вытащил какой-то старый код, который работал в новой системе, я использовал слишком текущую версию узла, я понизил рейтинг с 17 до 16, и это решило мою проблему.
Комментарии:
1. Я столкнулся с ошибкой при создании своего проекта с использованием пряжи. После понижения рейтинга узла с 17 до 16 все начало работать. Большое спасибо
2. @Stalinko рад, что здесь это помогло, часто сталкивался с этой же ошибкой с узлом 17. Мне нравится устанавливать node через NVM github.com/nvm-sh/nvm , а затем его очень легко переключать версии с помощью такой команды, как NVM 16.
Ответ №3:
Попытался проверить проблемы github, связанные с TLS, рукопожатием и версиями. Но не смог найти ни одного. Окончательное решение было предложено @Greggory Wiley.
Установлена nvm — уменьшена версия узла и npm. Исправил код. И это сработало.
Комментарии:
1. Лучше всего проголосовать и прокомментировать оригинальное опубликованное решение, которое сработало для вас, вместо того, чтобы публиковать другое решение в качестве исправления.