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
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:
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.)