Самозаверяющий SSL не работает после обновления с iojs до nodejs v4.4.4

я использовал iojs и koa в своем приложении, и недавно я решил обновить iojs до nodejs v4.4.4. Обновление было очень гладким, и мое приложение было запущено в кратчайшие сроки. Проблема в том, что я использую самозаверяющий SSL-сертификат на своей машине разработки, и после обновления до nodejs я получаю следующее сообщение при попытке доступа к веб-сайту:

этот сайт не может обеспечить безопасное соединение

localhost использует неподдерживаемый протокол.

ERR_SSL_VERSION_OR_CIPHER_MISMATCH

клиент и сервер не поддерживают общую версию протокола SSL или шифровальный набор. Это, вероятно, будет вызвано, когда серверу нужен RC4, который больше не считается безопасным.

Я использую nvm поэтому я попытался переключиться на iojs, и сайт снова работал.

после прочтения я узнал, что мне нужно обновить openssl для версии 1.0.2g вместо the 1.0.1g что я использовал для создания .key и .crt файлы. Поэтому я обновил openssl и сгенерировал новые файлы ключей и сертификатов, такие как:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

к сожалению это не решило проблему.

это код, который я использую для установки https на сервере:

let sslOptions = {
            key: fs.readFileSync('/etc/apache2/ssl/apache.key'),
            cert: fs.readFileSync('/etc/apache2/ssl/apache.crt')
                 };

let server = require('https').createServer(sslOptions, app.callback())

Я делаю что-то не так? Почему он работает с iojs и не работает с nodejs?

4 ответов


судя по сообщению об ошибке, ничего плохого с самоподписанным сертификатом. Но "сервер", предлагающий ssl-соединение, не поддерживает подходящую комбинацию версии протокола и набора шифров.

openssl s_client -connect localhost:443

или более многословным

openssl s_client -connect localhost:443 -debug

может сказать вам, что происходит не так во время ssl рукопожатия.

вы также можете узнать, какие комбинации предоставляются с помощью инструмента sslscan

apt-get install sslscan
sslscan localhost:443
sslscan localhost:443 | grep Accepted

В конце концов вы хотите настройте шифры, предлагаемые сервером https, предоставив больше ssloptions.

смотрите здесь https://certsimple.com/blog/a-plus-node-js-ssl


будет файл truststore (keystore), где должны быть зарегистрированы все доверенные сертификаты. Вы должны будете зарегистрировать этот вновь созданный сертификат там. Клиент использует этот файл truststore, чтобы проверить, можно ли доверять сертификату.

для получения более подробной информации вы можете взять ссылку ниже по ссылке: -

создание Самозаверяющих сертификатов (openssl & keytool)

надеюсь, это поможет.


Спасибо за ответы!

как я и подозревал, проблема была с чем-то, не связанным с openssl.

в моем приложении у меня есть config.js файл с конфигурацией приложения. Внутри него я читаю файлы сертификатов и добавляю их в объект javascript.

проблема была в том, что я использую lodash модуль для объединения 2 объектов javascript (один из которых содержал файлы сертификатов).

я использовал более старую версию the lodash модуль, и кажется, что он использовал Buffer объединить файлы. The Buffer реализация в этой версии не соответствовало Buffer реализация в новой Node.js версия. Это привело к неправильному слиянию файлов сертификатов и привело к ERR_SSL_VERSION_OR_CIPHER_MISMATCH сообщение об ошибке.

короче говоря, после обновления lodash модуль до последней версии, сертификат начал работать, как предполагалось.


Я не эксперт NodeJS. Но, похоже, вам нужно отключить RC4 на вашем узловом сервере. Думаю, в этом и проблема.