Як працює комутація сертифікатів HTTPS (наприклад, на suche.org)?


20

Для тих, хто не знає, що таке Suche.org, це веб-сайт, який має ідеальну оцінку A + у лабораторіях SSL у кожній категорії: ( результат SSL Lache Suche.org ). Мені стало відомо про цей веб-сайт, коли я відкрив ще один квиток про сертифікати ECC, які не працюють у Chrome , і один із респондентів використав сайт як приклад.

Мене бентежить те, що хоча в Protocol Supportрозділі звіту сказано, що веб-сайт використовує лише TLSv1.2 ...

TLS 1.2 Yes
TLS 1.1 No
TLS 1.0 No
SSL 3   No
SSL 2   No

Handshake SimulationОчевидно, це не так, оскільки в розділі видно, що деякі з модельованих старих клієнтів використовують TLSv1.0 для підключення ...

Android 4.0.4   EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.1.1   EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.2.2   EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.3     EC 384 (SHA256)     TLS 1.0 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA   ECDH secp521r1  FS
Android 4.4.2   EC 384 (SHA256)     TLS 1.2 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384   ECDH secp521r1  FS

Це трохи засмучує, тому що якщо я відключу TLSv1.0 на своєму тестовому веб-сайті, так ...

# Apache example
SSLProtocol all -SSLv3 -SSLv2 -TLSv1

Запуск сканування лабораторій SSL на моєму тестовому веб-сайті для деяких старих клієнтів дає наступне:

Android 4.0.4   Server closed connection
Android 4.1.1   Server closed connection
Android 4.2.2   Server closed connection
Android 4.3     Server closed connection
Android 4.4.2   EC 384 (SHA256)     TLS 1.2 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256   ECDH secp256r1  FS

Як можливо одночасно дозволити лише з'єднання TLSv1.2, але підтримувати і старших клієнтів?


Чи варто робити назву більш загальною, чимось на зразок "логіки перемикання HTTPS cert"?
gf_

1
@gf_ Гарна ідея. Зроблено.
Скотт Крукс

Відповіді:


17

Я впевнений, що вони перевіряють можливості клієнта і діють відповідно, як це пояснено в потоці, пов'язаному з відповіддю @Jeff .

Щоб зрозуміти, як це може виглядати детально, погляньте на це . Він показує реалізацію, виконану HAProxyдля обслуговування різних клієнтів різних сертів, залежно від їх можливостей. Я зробив повну копію / вставлення, щоб запобігти гниттю посилань, і тому, думаю, це питання може зацікавити в майбутньому:

Сертифікати SHA-1 вже виходять, і вам слід якнайшвидше оновити сертифікат до SHA-256 ... якщо ви не маєте дуже старих клієнтів і повинні підтримувати сумісність SHA-1 деякий час.

Якщо ви опинилися в цій ситуації, вам потрібно або змусити своїх клієнтів оновити (важко) або реалізувати певну форму логіки вибору сертифікатів: ми називаємо це "переключенням cert".

Найбільш детермінований метод вибору - це обслуговування сертифікатів SHA-256 клієнтам, які представляють TLS1.2 CLIENT HELLO, який явно оголошує про підтримку SHA256-RSA (0x0401) у розширенні підпису_алгоритмів.

розширення алгоритму підпису

Сучасні веб-браузери надсилають це розширення. Однак я не знаю жодного балансира навантаження з відкритим кодом, який наразі може перевірити вміст розширення підпис_алгоритми. Це може виникнути в майбутньому, але наразі найпростішим способом домогтися перемикання cert є використання ACL-файлів HAProxy SNI: якщо клієнт представляє розширення SNI, направляйте його на бекенд, який представляє сертифікат SHA-256. Якщо в ньому немає розширення, припустімо, що це старий клієнт, який розмовляє SSLv3 або якась зламана версія TLS, і представіть йому cert SHA-1.

Цього можна досягти за допомогою HAProxy за допомогою ланцюга інтерфейсу та пробілу:

HAProxy cert перемикання

global
        ssl-default-bind-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:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128
-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-R
SA-AES256-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK

frontend https-in
        bind 0.0.0.0:443
        mode tcp
        tcp-request inspect-delay 5s
        tcp-request content accept if { req_ssl_hello_type 1 }
        use_backend jve_https if { req.ssl_sni -i jve.linuxwall.info }

        # fallback to backward compatible sha1
        default_backend jve_https_sha1

backend jve_https
        mode tcp
        server jve_https 127.0.0.1:1665
frontend jve_https
        bind 127.0.0.1:1665 ssl no-sslv3 no-tlsv10 crt /etc/haproxy/certs/jve_sha256.pem tfo
        mode http
        option forwardfor
        use_backend jve

backend jve_https_sha1
        mode tcp
        server jve_https 127.0.0.1:1667
frontend jve_https_sha1
        bind 127.0.0.1:1667 ssl crt /etc/haproxy/certs/jve_sha1.pem tfo 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:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
        mode http
        option forwardfor
        use_backend jve

backend jve
        rspadd Strict-Transport-Security:\ max-age=15768000
        server jve 172.16.0.6:80 maxconn 128

Наведена вище конфігурація отримує вхідний трафік у інтерфейсі під назвою "https-in". Цей фронтленд знаходиться в режимі TCP і перевіряє КЛІЄНТУ HELLO, що надходить від клієнта, на значення розширення SNI. Якщо це значення існує і відповідає нашому цільовому сайту, воно посилає підключення до бекенда з назвою "jve_https", який перенаправляє на фронтенд, також названий "jve_https", де налаштований сертифікат SHA256 і подається клієнту.

Якщо клієнт не представляє КЛІЄНТУ HELLO з SNI або представляє SNI, який не відповідає нашому цільовому сайту, його переспрямовують на "https_jve_sha1" бекенд, а потім на відповідний інтерфейс, де подається сертифікат SHA1. Цей інтерфейс також підтримує старший шифрсуїт для розміщення старших клієнтів.

Обидва фронтени врешті-решт переспрямовуються на єдиний бекенд з назвою "jve", який направляє трафік на веб-сервери призначення.

Це дуже проста конфігурація, і в кінцевому підсумку її можна вдосконалити за допомогою кращих ACL (HAproxy регулярно додає новини), але для базової конфігурації перемикання cert це виконує завдання!


9

Аналогічне запитання було задано на веб- сайті https://community.qualys.com/thread/16387

Я думаю, що ця відповідь є рішенням:

suche.org - це розумна реалізація. Наскільки я розумію, він запитує можливості клієнта, а потім пропонує лише найкращі доступні, щоб зняти будь-які сумніви.


2
"це запитує можливості клієнта", не зовсім корисний опис. Навряд чи достатньо інформації для того, щоб хтось інший здійснив власну реалізацію.
живіт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.