Самозаверяющий 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 на вашем узловом сервере. Думаю, в этом и проблема.