HTTPS в Nodejs — ошибка:06065064 процедуры цифрового конверта evp_decryptfinal_ex неверная расшифровка

#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 отлично работает на наших серверах разработки.

  1. Есть ли проблема в HapiJS?
  2. Проблема в самом сертификате или ключе?
  3. Есть ли опция узла, которую я должен передать при создании службы?

Пожалуйста, помогите.

Комментарии:

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. Лучше всего проголосовать и прокомментировать оригинальное опубликованное решение, которое сработало для вас, вместо того, чтобы публиковать другое решение в качестве исправления.