HTTPS üzerinden bir JSON yükü (NIST'den CVE listesi) alan Java tabanlı bir uygulamayla ilgili bir sorunda hata ayıklıyorum. Doğrudan NIST'e bağlandığımda verileri başarıyla alıyorum. HTTP proxy kullandığımda, Sunucu Adı Gösterimi ile ilgili bir sorun olduğunu düşündüren bir TLS "tanınmayan ad" hatası alıyorum.

Java uygulamasının koduna erişimim yok ve JVM ayarlarıyla uğraşma konusunda çok az yeteneğim var. Bu nedenle, doğrudan openssl kullanarak bazı ayrı testler yapıyorum ve sorunu bir dereceye kadar bununla yeniden oluşturabiliyorum.

Aşağıdaki aramayı tcpdump yaptığımda, Client Hello paketinde bulunan server_name uzantısını görebiliyorum:

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

Wireshark sunucu adı uzantısını gösteriyor

Ancak, bunu Squid proxy'm aracılığıyla gönderirsem ve paketleri proxy ile hedef sunucu arasında aşağıdakilerle birlikte atarsam, Client Hello paketinde server_name uzantısı yoktur:

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

Openssl'den gelen yanıt:

140012895368512:error:14094458:SSL routines:ssl3_read_bytes:tlsv1 unrecognized name:../ssl/record/rec_layer_s3.c:1543:SSL alert number 112
---
no peer certificate available
---

Ve pakette server_name girişi olmadığını görebiliriz:

WireShark eksik uzantıyı gösteriyor

Hedef sunucunun hatayı döndürmesinin nedeninin bu olduğuna inanıyorum (anladığım kadarıyla bu durumda varsayılan bir sertifika döndürmesi gerekiyor).

Şimdi, sunucu adını manuel olarak belirterek proxy kullanarak bu işi yapabilirim:

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

Anladığım kadarıyla, proxy yalnızca TLS verilerini tünelliyor ve bunları değiştirmemeli, bu nedenle openssl'nin bir proxy kullanımdayken sunucu adı uzantısı bilgilerini göndermemeyi seçtiğini gösteriyor. Bu neden olabilir?

(Açıkçası openssl durumunda sunucuadı parametresini belirtebilirim, ancak Java uygulamasıyla bu lükse sahip değilim. Openssl'nin neden SNI ayrıntılarını bir proxy aracılığıyla göndermemeyi seçtiğini anlayabilirsem, bunun mümkün olabileceğini umuyorum. Java'nın neden aynı şeyi yaptığına biraz ışık tuttu.)

no answer