Назад | Перейти на главную страницу

Как удалить шифр RC4 с https-сервера node.js под Windows 2012 R2

Сканирование ssllabs.com показывает, что RC4 уже используется. Я читал, что RC4 должен быть отключен по умолчанию в Windows 2012 R2. Я запускаю сервер node.js с использованием https.createServer и не указываю шифры (позволяя использовать его по умолчанию)

ssllabs.com говорит:

This server accepts the RC4 cipher, which is weak

TLS_RSA_WITH_RC4_128_SHA (0x5)   WEAK
TLS_ECDHE_RSA_WITH_RC4_128_SHA (0xc011)   WEAK

Я отключил RC4 в реестре согласно этим инструкциям:http://windowsitpro.com/windows/disables-rc4-cipher

Я также попытался указать шифры в node createHttpsServer следующим образом:

        ciphers:            
        [   "ECDHE-RSA-AES128-GCM-SHA256",
            "ECDHE-ECDSA-AES128-GCM-SHA256",
            "ECDHE-RSA-AES256-GCM-SHA384",
            "ECDHE-ECDSA-AES256-GCM-SHA384",
            "DHE-RSA-AES128-GCM-SHA256",
            "ECDHE-RSA-AES128-SHA256",
            "DHE-RSA-AES128-SHA256",
            "ECDHE-RSA-AES256-SHA384",
            "DHE-RSA-AES256-SHA384",
            "ECDHE-RSA-AES256-SHA256",
            "DHE-RSA-AES256-SHA256",
            "HIGH",
            "!aNULL",
            "!eNULL",
            "!EXPORT",
            "!DES",
            "!RC4",
            "!MD5",
            "!PSK",
            "!SRP",
            "!CAMELLIA"
        ].join(':'),
        honorCipherOrder:   true

По-прежнему получаю то же сообщение о том, что RC4 используется, и моя оценка упала с B на C, поэтому установка списка шифров node.js действительно имеет значение.

Использование IIS Crypto для отключения шифров RC4 после выбора варианта передовой практики не привело к разнице в моих результатах сканирования ssllabs.

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

Как мне диагностировать это, чтобы отключить RC4 или узнать, где он используется, чтобы я мог его отключить?

Отключение чего-либо в реестре влияет только на то, что использует компоненты Windows для RC4 (IIS / IE). IIS Crypto тоже не имеет отношения, поскольку вы не используете IIS.

Но вы используете встроенный node.js https.createServer. Все настройки, связанные с RC4, будут происходить в node.js (поскольку node.js не заботится о реестре).

В node.js были добавлены новые лучшие шифры, которые появятся автоматически в следующем выпуске node.js

Если вы используете node.js 0.12, обновите свой список шифров из текущего источника.

Похоже, вы правильно указали шифры. Но уверены ли вы, что это код, который вы выполняете? Если вы используете node.js 0.12 или новее, RC4 по умолчанию отключен! Убедитесь, что все правильно обновлено и библиотеки в порядке.

Когда вы создаете встроенный экземпляр сервера, он будет выглядеть примерно так:

var server = https.createServer({
    key: privateKey,
    cert: certificate,
    ca: certificateAuthority,
    // default node 0.12 ciphers with RC4 disabled!!!
    ciphers: [
        "ECDHE-RSA-AES256-SHA384",
        "DHE-RSA-AES256-SHA384",
        "ECDHE-RSA-AES256-SHA256",
        "DHE-RSA-AES256-SHA256",
        "ECDHE-RSA-AES128-SHA256",
        "DHE-RSA-AES128-SHA256",
        "HIGH",
        "!aNULL",
        "!eNULL",
        "!EXPORT",
        "!DES",
        "!RC4",
        "!MD5",
        "!PSK",
        "!SRP",
        "!CAMELLIA"
    ].join(':'),
    honorCipherOrder: true
}, app);

Если вы используете недавний node.js, вам не следует указывать шифры, а просто использовать значения по умолчанию. Однако может быть целесообразно перечислить их для целей отладки.

Для простой отладки просто продолжайте использовать SSL Labs. Если SSL Labs по-прежнему говорит, что RC4 включен, попробуйте отключить один из других наборов шифров, чтобы убедиться, что вы действительно меняете фактический используемый код. Если вы не видите изменений - переключитесь на Fiddler, чтобы убедиться, что мы разговариваем с правильным сервером.

В var agent = new https.Agent так называемый "конфигурация" не имеет отношения. Этот фрагмент создает https.Agent (клиент) и указывает, с какими шифрами вы хотите подключиться. Затем вы подключитесь к одному из этих шифров, если они предложены сервером. Интересная часть https.createServer

Помните, что когда вы просматриваете сервер и устанавливаете заголовки с помощью Fiddler, вы делаете то же самое, что и var agent = new https.Agent. Вы спрашиваете, какой набор шифров вы хотели бы использовать. Попробуйте запросить RC4 только с помощью Fiddler и посмотрите, будет ли это принято. Затем вы должны посмотреть, что возвращается с сервера, чтобы убедиться, что вы действительно «разговариваете» с экземпляром node.js, которым вы себя считаете!

Приведенный выше фрагмент и пошаговые инструкции для А + можно найти на CertSimple

Шаги по устранению неполадок:

  1. Проверить версию node.js

  2. Проверьте версию node / lib / tls.js

  3. Убедитесь, что вы подключаетесь к правильному экземпляру node.js (запуск / подключение / остановка / подключение)

  4. Установите Fiddler на прием только RC4

Если Fiddler подключается к RC4 - вам нужно изменить код. Если Fiddler не может подключиться к RC4 - а SSL Labs по-прежнему делает - тогда у вас есть прокси (или что-то еще!) Между вашим node.js и SSL Labs.

Обновить: Если Fiddler слишком сложно настроить, то некоторые практические инструменты для проверки шифров, принятых сервером, можно найти на Суперпользователь

Я понял ответ.

Шифры по умолчанию для TLS:

ECDHE-RSA-AES128-SHA256: DHE-RSA-AES128-SHA256: AES128-GCM-SHA256: RC4: HIGH:! MD5:! ANULL

Я нашел это, проверив свойство tls.DEFAULT_CIPHERS.

Уведомление RC4 включено.

Таким образом, шифры по умолчанию для https были в порядке, однако tls имеет свой собственный шифр по умолчанию.

Я думаю, что конфигурация реестра влияет только на браузеры, поэтому вам нужно будет установить свои шифры в node.js. Вот что сработало для меня:

var agent = new https.Agent({
  "key": key,
  "cert": cert,
  "ciphers": 'EECDH+AES128:EECDH+3DES:EDH+3DES:!SSLv2:!MD5:!DSS:!aNULL',
  "honorCipherOrder": true
});