Come funziona la commutazione del certificato HTTPS (come su suche.org)?


20

Per coloro che non sanno cosa sia Suche.org, si tratta di un sito Web che ha un punteggio A + perfetto su SSL Labs in ogni categoria: (risultato Suche.org SSL Labs ). Mi sono reso conto di questo sito web quando ho aperto un altro biglietto relativo ai certificati ECC che non funzionavano in Chrome e uno dei rispondenti ha usato il sito come esempio.

Ciò che mi confonde è che sebbene la Protocol Supportsezione del rapporto affermi che il sito Web utilizza solo TLSv1.2 ...

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

Questo chiaramente non è il caso poiché sotto la Handshake Simulationsezione, mostra che alcuni dei client più vecchi simulati utilizzano TLSv1.0 per connettersi ...

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

Questo è un po 'frustrante perché se disabilito TLSv1.0 sul mio sito Web di test in questo modo ...

# Apache example
SSLProtocol all -SSLv3 -SSLv2 -TLSv1

L'esecuzione della scansione di SSL Labs sul mio sito Web di prova produce quanto segue per alcuni dei client più vecchi:

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

Come è possibile consentire contemporaneamente solo connessioni TLSv1.2, supportando anche i client più vecchi?


Dovremmo rendere il titolo più generico, qualcosa come "HTTPS cert switching logic"?
gf_

1
@gf_ Buona idea. Fatto.
Scott Crooks,

Risposte:


17

Sono abbastanza sicuro che stiano verificando le capacità del client e agiscano di conseguenza, come spiegato nel thread collegato nella risposta di @Jeff .

Per avere un'idea di come potrebbe apparire nei dettagli, dai un'occhiata a questo . Mostra un'implementazione realizzata HAProxyper servire diversi clienti diversi certificati, a seconda delle loro capacità. Ho fatto una copia / incolla completa, per prevenire la putrefazione dei link e perché penso che questa domanda potrebbe essere di interesse per il futuro:

I certificati SHA-1 stanno per uscire e dovresti passare a un certificato SHA-256 il prima possibile ... a meno che tu non abbia client molto vecchi e debba mantenere la compatibilità SHA-1 per un po '.

Se ti trovi in ​​questa situazione, devi forzare i tuoi clienti a eseguire l'aggiornamento (difficile) o implementare una qualche forma di logica di selezione dei certificati: la chiamiamo "cert switching".

Il metodo di selezione più deterministico consiste nel fornire certificati SHA-256 ai client che presentano un CLIENT CIAO TLS1.2 che annuncia esplicitamente il loro supporto per SHA256-RSA (0x0401) nell'estensione signature_algorithms.

estensioni dell'algoritmo di firma

I browser Web moderni invieranno questa estensione. Tuttavia, non sono a conoscenza di alcun servizio di bilanciamento del carico open source attualmente in grado di ispezionare il contenuto dell'estensione signature_algorithms. Potrebbe venire in futuro, ma per ora il modo più semplice per ottenere il cambio di certificato è usare ACL SNAP HAProxy: se un client presenta l'estensione SNI, indirizzalo a un back-end che presenta un certificato SHA-256. Se non presenta l'estensione, supponi che sia un vecchio client che parla SSLv3 o una versione non funzionante di TLS e presenta un certificato SHA-1.

Ciò può essere ottenuto in HAProxy concatenando frontend e backend:

Commutazione del certificato HAProxy

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

La configurazione sopra riceve traffico in entrata nel frontend chiamato "https-in". Quel frontend è in modalità TCP e controlla il CLIENT HELLO proveniente dal client per il valore dell'estensione SNI. Se quel valore esiste e corrisponde al nostro sito di destinazione, invia la connessione al back-end denominato "jve_https", che reindirizza a un front-end chiamato anche "jve_https" in cui il certificato SHA256 è configurato e servito al client.

Se il client non riesce a presentare un CLIENT HELLO con SNI o presenta un SNI che non corrisponde al nostro sito di destinazione, viene reindirizzato al backend "https_jve_sha1", quindi al frontend corrispondente dove viene offerto un certificato SHA1. Quel frontend supporta anche una suite di cifratura precedente per soddisfare i client più vecchi.

Entrambi i frontend alla fine reindirizzano a un singolo backend chiamato "jve" che invia il traffico ai server Web di destinazione.

Questa è una configurazione molto semplice, e alla fine potrebbe essere migliorata usando ACL migliori (HAproxy ne aggiunge regolarmente di nuovi), ma per una configurazione di commutazione di cert di base, fa il lavoro!


9

Una domanda simile è stata posta all'indirizzo https://community.qualys.com/thread/16387

Penso che questa risposta sia la soluzione:

suche.org è un'implementazione intelligente. Per quanto ho capito, interroga le capacità del cliente e quindi offre solo il meglio disponibile, per eliminare qualsiasi dubbio.


2
"interroga le capacità del cliente" non è esattamente una descrizione utile, però. Non ci sono abbastanza informazioni per chiunque altro per fare la propria implementazione.
Womble
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.