По-прежнему в ходу RC4/3DES/TLS 1.0 и сертификаты на сотни лет. Анализ сотен миллионов SSL-рукопожатий
Если посмотреть на набор данных с 350 млн SSL-соединений, сразу возникает несколько вопросов:
- кто выдал эти сертификаты
- какая там криптография
- каково их время жизни
Let's Encrypt выдал сертификаты почти для 30% доменов
Наш сервер (leebutterman.com) автоматически получает сертификаты Let's Encrypt — это самый популярный центр сертификации в интернете! Свыше 47 миллионов доменов защищены сертификатами Let's Encrypt, то есть почти 30% нашей выборки.
352,3 млн доменов смогли установить 158,7 млн соединений с указанием сертификата и эмитента. Первая десятка:
47,2 млн Let's Encrypt 28,9 млн DigiCert 13,8 млн Comodo 10,1 млн Google 7,2 млн GoDaddy 7,1 млн Sectigo 7,0 млн Cpanel 6,1 млн GlobalSign 3,4 млн CloudFlare0 2,5 млн Amazon 2,1 млн (анонимная самоподпись) 1,1 млн Plesk
В схеме zgrab это
.data.tls.server_certificates.certificate.parsed.issuer_dn
, результаты можно воспроизвести с помощью zcat 2019-08-01-ssl-*.gz | parallel --pipe jq -r .data.tls.server_certificates.certificate.parsed.issuer_dn | sort | uniq -c zcat 2019-08-01-ssl-*.gz | parallel --pipe jq -r .data.tls.server_certificates.certificate.parsed.issuer_dn | sort | uniq -c zcat 2019-08-01-ssl-*.gz | parallel --pipe jq -r .data.tls.server_certificates.certificate.parsed.issuer_dn | sort | uniq -c
Срок действия сертификатов Let's Encrypt составляет три месяца, стимулируя регулярный цикл обновлений, но сегодня в интернете остаётся множество древних методов безопасности.
Почти три миллиона доменов с RC4 или 3DES
Из 160 млн соединений более 150 млн использовали эллиптические кривые, протокол Диффи — Хеллмана и AES. Следующим по популярности набором шифров стал RSA с RC4, а почти 1,8% соединений использовали RC4 или 3DES, и даже DES на шести доменах! (
zcat 2019-08-01-ssl-*.gz | parallel --pipe jq -r .data.tls.server_hello.cipher_suite.name | sort | uniq -c zcat 2019-08-01-ssl-*.gz | parallel --pipe jq -r .data.tls.server_hello.cipher_suite.name | sort | uniq -c
)120457325 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 16750820 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 13808304 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 2393679 TLS_RSA_WITH_RC4_128_SHA 1768423 TLS_RSA_WITH_AES_256_CBC_SHA 1653084 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 1397638 TLS_RSA_WITH_AES_128_CBC_SHA 373383 TLS_ECDHE_RSA_WITH_RC4_128_SHA 157929 TLS_RSA_WITH_3DES_EDE_CBC_SHA 17663 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 4041 TLS_ECDHE_ECDSA_WITH_RC4_128_SHA 2794 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA 458 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 205 TLS_RSA_WITH_RC4_128_MD5 115 TLS_DH_RSA_WITH_AES_128_CBC_SHA 28 неизвестный 6 TLS_RSA_WITH_DES_CBC_SHA 1 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Обратите внимание, что последний Chrome не может принять RC4, но принимает 3DES (спасибо,
badssl.com
!)Более четырёх миллионов доменов с устаревшим TLS
По умолчанию пакет TLS в go не использует TLS 1.3 — кажется, что набор данных собирали с zgrab, который не использует TLS 1.3 (наверное, лучше обновить его к следующим запускам). Серверы большинства доменов использовали TLS 1.2, но более четырёх миллионов работают на TLS 1.0 (
zcat 2019-08-01-ssl-*.gz | parallel --pipe jq -r .data.tls.server_hello.version.name | sort | uniq -c zcat 2019-08-01-ssl-*.gz | parallel --pipe jq -r .data.tls.server_hello.version.name | sort | uniq -c
).154500876 TLSv1.2 4263887 TLSv1.0 19352 TLSv1.1 1781 SSLv3
TLS 1.0 до сих пор разрешён в Chrome.
Сотни тысяч сертификатов доменов истекают после 2099 года
В соответствии с лучшими практиками от Let’s Encrypt, срок службы SSL-сертификатов должен быть 90 дней.
Но лучшие практики не запрещают альтернативные практики!

Фото Рика Голдвасера из Флагстаффа, Аризона, США [CC BY 2.0], via Wikimedia Commons
В дикой природе встречаются сертификаты с тысячелетним сроком жизни, как эти остистые сосны.
Тысячи сертификатов истекают после 3000 года
Более 3000 сертификатов не истекают в этом тысячелетии. Свыше 8000 сертификатов истекают после 2200 года. Более 200 000 сертификатов — после 2100 года (более 1,5 млн — только в 2040-х годах!)
Так, в одном 2117 году истекает срок действия более 100 000 сертификатов, а в 3017-м — более тысячи. Возможно, именно в 2017 году что-то внушало доверие к долгоживущим сертификатам?
Миллионы сертификатов уже истекли
У почти 1,6 млн доменов сертификат истёк недавно (в июле, месяце сканирования). У почти 3,7 млн доменов сертификат истёк в 2019 году. Свыше 9,6 млн доменов работают с сертификатом, срок действия которого вышел в 2010-е годы!
Сотни обслуживаемых сертификатов ещё не действительны
Более того, у более ста тысяч сертификатов срок действия истекает до начала срока их действия!
Исследуйте сами
Дайте знать, что вы думаете! Проанализируйте этот набор данных и поделитесь результатами!
Комментарии (28)
am-habr
09.09.2019 12:07Имел возможность получить опыт настройки сертификата у letsencrypt. Всегда хочется по-быстрому настроить, особенно если доменов несколько, лень ведь читать простыни текста.
Всё просто, скачал бота, поверил большей части настроек. Опа — сертификат готов, всё работает. Через время смотришь лог.
- Сертификаты не хочет проверять, слишком много доменов за раз.
- Слишком частые запросы делаете, мы вас забанили на пару дней.
- Напортачил с правами, удалил сертификат, неотозвав — у вас много действующих сертификатов, теперь подождите ещё пару дней.
- Домен не проходит валидацию — неправильно настроена папка .well-known/acme-challenge.
- Для acme-challenge нужен порт 80, только 443 не пойдёт.
- Обновил ядро, питон законил и ещё его нужно подкрутить.
Чтобы настроить, нужно было прочитать все их простыни документации и форумы, общими знаниями не обошлось. После прочтения всё кажется логичным.
Читаешь их форум и 100500 людей наступают на теже самые грабли.
letsencrypt — очень хорошая и правильная инициатива.
Но за бесплатно нужно хорошенько разобраться, как работают механизмы. Лучше всего ещё потестировать весь цикл: сертификаты нагенерировать, отозвать, снова сгенерировать, проверить все логи сервера.ky0
09.09.2019 12:59Как обычно говорят в таких случаях на Тостере — «наймите админа» :)
chupasaurus
09.09.2019 14:57Мой ответ двухлетней давности всё ещё актуален и легко делается без docker compose. Сильно удивился, увидев ваш вариант с предложением выпускать сертификаты через certbot-auto (это инсталлятор certbot, если что).
kemko
10.09.2019 09:17+1Вы могли не ждать 3 месяца, а сначала оттестировать процесс получения и обновления сертификатов на тестовом эндпоинте, а затем уже переходить на боевой.
0xd34df00d
10.09.2019 17:17О да, особенно по последнему пункту. Постоянно отваливающийся certbot уже почти заставил меня написать альтернативный клиент на чем-нибудь компилируемом.
Revertis
12.09.2019 23:00Лучше использовать acme.sh, и подтверждать через DNS.
Не нужен ни питон, ни 80-й порт, ни .well-known.
webviktor
09.09.2019 12:22+1Интересно.
А как можно получить сертификат от Летс хотя бы на 1,2,3 года?farcaller
09.09.2019 13:37Прямо в статье же ссылка есть почему никак.
webviktor
09.09.2019 13:42И прямо под этой ссылкой текст:
Но лучшие практики не запрещают альтернативные практики!
Что явно указывает на то, что есть возможность сделать сертификат на больший срок.
sintech
09.09.2019 19:29+1Интересно, много ли из 100-1000-летних сертификатов не самоподписанные? И кто их выдает?
eStellar
10.09.2019 10:05Если всё настроено хорошо и правильно, то всё работает. Exim + Debian + Cisco ipv6, как перешли, так уже второй год само, даже без вмешательств.
Мне же достался криво настроенный Эксчендж, где обновляться не хотело ни в какую, внезапно, после полугода нормальной работы. Точнее обновилось, потом появилась ошибка — ждите, слишком много повторных запросов. Итогом была: возня в течении двух рабочих дней по 12 часов двух специалистов, простой внешней почты у всей организации всё это время, оплата из своего кармана работы второго специалиста и увольнение с испытательного срока. Купили Эксчендж, а на сертификате сэкономили. Заплатил бы столько-же денег из своих за платный сертификат, возможно работал бы дальше у них.tlv
10.09.2019 13:17Так может не в letsencrypt или платности дело, а в том, что серитфикат пошли обновлять сразу перед/после его истечения? Почему с платным было бы по другому? Тот же letsencrypt рекомендует обновлять сертификат за месяц, и в этом случае у вас есть месяц на решение возможных проблем.
eStellar
10.09.2019 14:26Дело в том что он и обновился заранее. Но в итоге с новым сертификатом потребовалась работа полностью по ipv6 и обнаружилось это тогда когда старый истёк, а новый отказался работать. Разумеется, генерация нового сертификата ругалась что он уже выполнен. А по коду ошибок на форумах было несколько решений, которые надо было попробовать последовательно пока не выяснится в чём-же дело. У продавцов платных решений на этот счёт есть как минимум техподдержка и ответственность. В частности потеря времени на перебор и поиск решения заняла фатальное (для меня) время, в то время как правило о том что работать будет всё это только по ipv6 инициировала Letsencrypt. Возможно моему предшественнику приходили какие-то сообщения, но он о них умолчал или забыл/забил. А я ранее не сталкивался т.к. на прежнем месте всё по умолчанию было настроено через ipv6 и данная проблема не имела прецедента.
Tufed
10.09.2019 14:59С другой стороны может даже лучше что сразу увольнение, чем мучаться с таким отношением и влетететь позже но на более большой проблеме.
eStellar
10.09.2019 16:58В данном случае справедливо. Но только в организациях, где всё настроено не ванильно-красиво, по канонам, замечаешь массу подводных камней, которые идут в копилку опыта.
Tufed
11.09.2019 15:12Вопрос не про то как как оно настроено, а в отношении руководства к остановкам по задачам. Если образовалась проблема, то нужно определить по чьей вине. Ошибки админа или ошибки кривого софта — это разные вещи. За второе админ не отвечает, не он писал этот софт. Ошибки админа — тоже допускаю, но если ему не была выдана подробная инструкция «как это делать» — то какой смысл с него спрашивать правильное выполнение и увольнять за неправильное? В РФ часто забивают болт на инструкции и обучение сотрудника, но при этом требуют чтобы знал и умел, в противном случае угрозы увольнения.
urands
Правильно я понимаю, летс энкрипт может расшифровать 30% https трафика в интернете?
interprise
Перевыпустив ваш сертификат, да. Справедливости ради, стоит сказать, что по сути тоже самое может сделать любая структура которая имеет корневой сертификат.
ky0
Нет, не может — приватный ключ не покидает сервер клиента. Перевыпустить сертификат и сделать затем mitm — да, может. Частично от этого может защитить HPKP и CAA-записи в DNS.
Tufed
Если во время генерации они сохраняли бы себе приватный ключ — то да, MITM осуществим с использованием оного. Однако в текущей ситуации даже при пере-выпуске сертификата MITM не осуществим до тех пор, пока ваш сайт не начнёт использовать новый сгенерированный сертификат. Корневой же сертификат используется для проверки «кто выдал», но никак не поможет в расшифровке траффика, зашифрованного уже выданным дочерним сертификатом. Поправьте те, кто знает спецификацию сертификации лучше меня.
Tufed
добавлю ссылку на эту статью, подробно рассказывающую как это работает.
gotch
Forward Secrecy для того и придумали, чтобы нет? Если в tls сессии был использован DH, то имея ее полный дамп и закрытый ключ сервера, расшифровать ее не получится.
Возможно не-дилетанты в криптографии меня поправят.
gotch
Даже если ваш ключ сгенерирован сторонним сайтом, что иногда делают на шареных хостингах, где let's encrypt не работает из коробки.