Puncte:0

Antetul SNI lipsește din clientul TLS Salut când utilizați proxy HTTP

drapel ar

Depanez o problemă cu o aplicație bazată pe Java care preia o sarcină utilă JSON (lista CVE din NIST) prin HTTPS. Când mă conectez direct la NIST, recuperez datele cu succes. Când folosesc un proxy HTTP, primesc o eroare TLS „nume nerecunoscut” care sugerează o problemă cu indicarea numelui serverului.

Nu am acces la codul aplicației Java și am o capacitate minimă de a face probleme cu setările JVM. Prin urmare, am făcut niște teste separate folosind openssl direct și sunt capabil să reproduc problema într-o oarecare măsură cu aceasta.

Când tcpdump următorul apel, pot vedea extensia server_name prezentă în pachetul Client Hello:

openssl s_client -connect services.nvd.nist.gov:443

Wireshark afișează extensia numelui serverului

Cu toate acestea, dacă trimit acest lucru prin proxy-ul meu Squid și arunc pachetele dintre proxy și serverul țintă cu următoarele, nu există nicio extensie server_name prezentă în pachetul Client Hello:

openssl s_client -connect services.nvd.nist.gov:443 -proxy myproxy:3128

Răspunsul de la openssl este:

140012895368512:error:14094458:Rutine SSL:ssl3_read_bytes:tlsv1 nume nerecunoscut:../ssl/record/rec_layer_s3.c:1543:Numărul alertei SSL 112
---
nu este disponibil niciun certificat de egalitate
---

Și putem vedea că nu există nicio intrare server_name în pachet:

WireShark arată o extensie lipsă

Cred că acesta este motivul pentru care serverul țintă returnează eroarea (deși din câte am înțeles, ar trebui să returneze un certificat implicit în această situație).

Acum pot face asta să funcționeze folosind proxy-ul specificând manual numele serverului:

openssl s_client -connect services.nvd.nist.gov:443 -proxy myproxy:3128 -servername nvd.nist.gov

Înțeleg că proxy-ul doar tunelizează datele TLS și nu ar trebui să le modifice, așa că sugerează că openssl alege să nu trimită informațiile despre extensia numelui serverului atunci când un proxy este în uz. De ce ar fi asta?

(Evident că în cazul openssl pot specifica doar parametrul servername, dar cu aplicația Java nu am acest lux. Sper că dacă pot înțelege de ce openssl alege să nu trimită detaliile SNI printr-un proxy, s-ar putea ca aruncă puțină lumină asupra motivului pentru care Java pare să facă același lucru.)

Steffen Ullrich avatar
drapel se
Mi se pare o eroare că `openssl s_client` nu trimite numele serverului în mod implicit când este folosit proxy. Dar pot reproduce problema cu OpenSSL 1.1.1h și 1.1.1f. Dar s_client nu este Java, așa că aș susține că aceste probleme au cauze diferite.
Gordon Mckeown avatar
drapel ar
Vă mulțumim pentru timpul acordat pentru a reproduce problema, @SteffenUllrich. De acord, ele ar putea avea cauze diferite; pare o coincidență ciudată că amândoi par să prezinte același comportament, așa că m-am întrebat dacă există ceva despre utilizarea unui proxy care a dictat un comportament TLS diferit. De asemenea, a fost mult mai ușor să testați și să explicați problema folosind openssl :). Am deschis o [bug](https://github.com/openssl/openssl/issues/17232) împotriva openssl.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.