Почему-то на днях взбрело мне в голову сделать HTTPS на своем старом-древнем проекте audiocoding.ru. Не могу сказать, что он там хоть сколько-то необходим. Да он по сути там и не нужен. Но, несколько поводов для этого странного действия у меня все же было. Во-первых, я никогда не касался установки и настройки HTTPS, очень хотелось заполнить этот пробел. Во-вторых, являясь большим почитателем Mozilla, я прознал, что у них есть некоторые туманные планы по постепенному отказу от HTTP. В общем, в любом случае, введение опционального HTTPS на моем информационном сайте хоть пользы бы и не принесло, но и вряд ли бы помешало. Таким образом, я решил поделиться своей небольшой историей. Попытаюсь не вдаваться в глубокие технические детали, а лучше приведу несколько ссылок в конце заметки.

WoSign бесплатный сертификат на 3 года

Началось все с того, что я узнал про возможность получения бесплатного сертификата на WoSign на 3 года. Меня это заинтересовало, потому что раньше я слышал только про платные и достаточно дорогие сертификаты. Пришлось столкнуться с трудностями в лице китайского языка, но за халяву можно было и потерпеть, правда? Какое-то время поковырявшись, я смог оставить заявку на получение. На следующий день мне на почту пришло письмо, что я могу его забирать. Пройдя по ссылке в письме, мне предоставили возможность загрузить сертификат в запароленном архиве (пароль вы вводите в момент создания заявки). В общем, все отлично сертификат был на руках.

nginx и небольшие подвохи

Естественно нужно было загрузить сертификаты на сервер и что-то с ними сделать. Перечитав немного информации в Интернете, действия сложными не были. Прикладываю вырезки конфигурации nginx-сервера:

http {
    ...
    ##
    # SSL Settings
    ##
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_stapling on;
    resolver 8.8.8.8 8.8.4.4;
    ...
    server {
        listen 80;
        listen 443 ssl;
        server_name audiocoding.ru;
        ssl_certificate path/to/cretificate.crt;
        ssl_certificate_key path/to/key.key;

        # Этот заголовок заставляет браузер использовать HTTPS принудительно в течении недели,
        # но чтобы это сработало, пользователь хоть раз должен зайти на HTTPS-версию сайта.
        add_header Strict-Transport-Security 'max-age=604800';
        ...
    }
    ...
}

Собственно, все казалось бы хорошо, configtest показывает [ OK ], сервер рестартится успешно, но сайт не открывается. Я уже было начал ломать голову, как вдруг какой-то ответ на stackoverflow.com заставил меня сделать фейспалм. Дело в том, что в какие-то времена фанатичности я закрыл все порты в iptables, кроме 80 и 22. Ну так, недолго думая, открыл еще и 443. Все заработало, сертификат всеми браузерами воспринимается как доверенный. Что ж, поживем – увидим. Быть может, позднее будут какие-то проблемы с Chrome. Китайский сертификат и Google все таки вещи слабосовместимые.

add_header я все же закомментарил после этих размышлений…

Производительность HTTP против HTTPS

Ну конечно же, мне не могло не прийти в голову, что наверное HTTPS теперь будет медленнее HTTP. Решил прогнать свою главную страницу через siege, команду выбрал достаточно простую:

siege -b -t10s -c50 http://audiocoding.ru/

Для HTTPS аналогично.

Итак, тесты для HTTP показали:

Transactions:                823 hits
Availability:             100.00 %
Elapsed time:               9.57 secs
Data transferred:          15.18 MB
Response time:              0.56 secs
Transaction rate:          86.00 trans/sec
Throughput:                 1.59 MB/sec
Concurrency:               48.56
Successful transactions:     823
Failed transactions:           0
Longest transaction:        1.01
Shortest transaction:       0.17

Для HTTPS:

Transactions:                622 hits
Availability:             100.00 %
Elapsed time:               9.68 secs
Data transferred:          11.47 MB
Response time:              0.75 secs
Transaction rate:          64.26 trans/sec
Throughput:                 1.19 MB/sec
Concurrency:               48.24
Successful transactions:     622
Failed transactions:           0
Longest transaction:        1.26
Shortest transaction:       0.29

Таким образом, делаем вывод, что HTTPS замедлил работу сайта на 25%. Да, это на самом деле много в относительном значении. В абсолюнтых показателях, взяв кратчайшее время, 170 мс против 290 мс – разница вроде бы и не велика, но все равно ощутима. В общем-то отчасти еще и поэтому, поддержку HTTPS я оставлю опциональной.

Ах да, чуть не забыл, тесты выполнялись на виртуальной машине за $10 в облаке DigitalOcean (1GB RAM, 1 ядро CPU, 30GB SSD). Географически siege запускался в Москве, сервер при этом находился в Амстердаме.

Ссылки

Как и обещал, прикладываю несколько тематических ссылок, чтобы вам было проще разобраться с материалом:

  1. Официальная страница по настройке HTTPS в nginx
  2. Неплохая статья на хабре по той же теме
  3. Статья на хабре о том, как осилить WoSign