Подтвердить что ты не робот

Прекратить высокую стоимость SSL-соединений

Недавно я установил сервер веб-сокетов Node.js, который был протестирован для обработки около 2000 новых запросов на подключение в секунду на небольшом экземпляре EC2 (m1.small). Учитывая стоимость экземпляра m1.small и возможность поместить несколько экземпляров за прокси-сервер, поддерживающий WebSocket, такой как HAProxy, мы очень довольны результатами.

Однако мы поняли, что еще не проводили тестирование с использованием SSL, поэтому рассмотрели несколько вариантов SSL. Стало очевидно, что прекращение SSL-соединений на прокси-сервере идеально, потому что тогда прокси-сервер может проверять трафик и вставлять заголовки, такие как X-Forward-For, чтобы сервер знал, к какому IP-адресу пришел запрос.

Итак, я рассмотрел ряд решений, таких как Pound, stunnel и stud, все из которых позволяли завершать входящие соединения на 443, а затем передавались на HAProxy на порт 80, который, в свою очередь, передавал соединение на веб-серверы, К сожалению, однако, я обнаружил, что отправка трафика на прокси-сервер терминации SSL на экземпляре c1.medium(High CPU) очень быстро потребляет все ресурсы ЦП и только со скоростью 50 или около того запросов в секунду. Я попытался использовать все три из перечисленных выше решений, и все они выполнялись примерно так же, как я предполагаю, под капотом, которые все они полагаются на OpenSSL в любом случае. Я попытался использовать 64-разрядный очень большой экземпляр High CPU (c1.xlarge) и обнаружил, что производительность только линейно зависит от стоимости. Поэтому, основываясь на ценах EC2, мне нужно будет заплатить примерно 200 долл./М за 200 запросов SSL в секунду, в отличие от 60 долл./М за 2000 без запросов SSL в секунду. Бывшая цена становится экономически нежизнеспособной очень быстро, когда мы начинаем планировать принимать 1000 или 10000 запросов в секунду.

Я также пытался прекратить использование SSL с помощью сервера https Node.js ', и производительность была очень похожа на Pound, stunnel и stud, поэтому нет явного преимущества для этого подхода.

Так что я надеюсь, что кто-то может помочь с этим, советует, как я могу обойти эту смешную стоимость, которую мы должны поглотить, чтобы обеспечить SSL-соединения. Я слышал, что аппаратные ускорители SSL обеспечивают гораздо лучшую производительность, поскольку аппаратное обеспечение предназначено для шифрования и дешифрования SSL, но поскольку в настоящее время мы используем Amazon EC2 для всех наших серверов, использование аппаратных ускорителей SSL не является вариантом, если у нас нет отдельных данных центра с физическими серверами. Я просто пытаюсь понять, как подобные Amazon, Google и Facebook могут обеспечить весь свой трафик через SSL, когда стоимость этого настолько высока. Там должно быть лучшее решение.

Приветствуются любые советы или идеи.

Спасибо Matt

4b9b3361

Ответ 1

Я не знаю много о мощности процессора, доступной в разных экземплярах EC2, но я предполагаю, что ваша проблема кроется не в выборе программного обеспечения прокси-сервера с терминацией TLS, а с их конфигурацией. Без какой-либо конфигурации я предполагаю, что все они будут предлагать все поддерживаемые ими шифровальные пакеты, включая (очень) медленные. И они, вероятно, позволят клиенту выбрать тот, который ему больше всего нравится.

Не все комплекты шифрования TLS рождаются равными, некоторые из них имеют более высокие затраты на процессор, чем другие, будь то от обмена ключами или самого шифрования. В зависимости от используемого программного обеспечения должен быть способ указать строку шифров, которую принимает сервер (а также способ заставить сервер настаивать на этом). Для OpenSSL они работают следующим образом: http://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS

Если вы идете на скорость, по крайней мере, убедитесь, что вы не используете шифры, в которых используется обмен ключами Диффи-Хеллмана (неэллиптическая кривая). Чтобы отключить набор шифров с использованием обмена ключами DH, убедитесь, что в какой-то момент строка содержит !DH. Вы можете проверить, какие строки приводят к тому, какие шифры доступны, например, openssl ciphers -v 'HIGH:!aNULL:!DH:!ECDH'.

Эта строка отключает как обычные обмены Diffie-Hellman, так и Elliptic Curve Diffie-Hellmann. Вероятно, это исключает обмен ключами RSA в зависимости от вашей версии OpenSSL.

Что касается шифров, вы должны, вероятно, проверить на своем оборудовании EC2. Без аппаратного ускорения вам, вероятно, следует предпочесть RC4 над AES128 над AES256 над чем-либо еще, по крайней мере в соответствии с этим эталоном.

Я также предлагаю читать этот замечательный пост, особенно просветительскую первую диаграмму, показывающую влияние DH на производительность рукопожатия TLS.

Наконец, убедитесь, что вы используете кеширование сеанса TLS. Это также экономит некоторый процессор.

Ответ 2

Я только что понял, что Amazon Elastic Load Balancer очень медленный для завершения SSL... Я сделал простой тест на www.blitz.io(без отношения, только клиент) с 1 до 250 одновременных соединений за 1 минуту. Это провалилось ужасно... Но если я делаю TCP 443 на лицевой стороне ELB и TCP 443 на сервере без сертификата, он уничтожает небольшой процессор экземпляра при запуске IIS и SSL-сертификата в этом экземпляре. Мне нужны только рукопожатия, это простой веб-сервис, обслуживающий клиентов со всех сторон. Новая настройка соединения и отключение каждый раз.

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

Ответ 3

Производительность сервера Node.js 'https очень похожа на Pound, stunnel и stud, и нет четкого преимущества для этого подхода.

Ответ 4

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