Ruby'de OpenSSL::SSL::SSLError: SSL_connect SYSCALL returned=5 errno=0 state=SSLv3 read server hello A benzeri bir ileti aldığınızda, sunucu el sıkışma sırasında bağlantıyı TLS uyarısı göndermeden kapatmış demektir. Sertifika doğrulama hatasından farklıdır; burada sorun genellikle görüşme daha başlamadan biter.
Olası nedenler
- Sunucu yalnızca TLS 1.2/1.3 kabul ediyor, eski Ruby/OpenSSL ise desteklenmeyen bir sürüm öneriyor.
- SNI gerekli, ancak istemci ana bilgisayar adını göndermiyor (ör. adres IP ile çağrılıyor).
- Güvenlik duvarı, WAF veya proxy bağlantıyı kesiyor.
- Ortak cipher suite bulunamıyor.
- Hedef servis yüksek yük altında bağlantıları sıfırlıyor (geçici).
Teşhis ve çözüm
- Ruby dışında aynı bağlantıyı deneyin:
Bu da başarısızsa sorun ağ/sunucu tarafındadır.openssl s_client -connect ornek.com:443 -servername ornek.com -tls1_2 - Ruby'nin bağlı olduğu OpenSSL sürümünü görün:
ruby -ropenssl -e 'puts OpenSSL::OPENSSL_LIBRARY_VERSION'. Çok eski bir sürüm modern sunucuyla konuşamayabilir; Ruby ve OpenSSL'i güncelleyin. - Bağlantıyı ana bilgisayar adıyla kurun, IP ile değil.
- Gerekirse TLS sürümünü açıkça belirleyin:
require "net/http" http = Net::HTTP.new("ornek.com", 443) http.use_ssl = true http.min_version = :TLS1_2 - Kurumsal ağdaysanız güvenlik cihazının kural günlüğüne bakın.
Önleme
Bağımlılıkları güncel tutun, tekrar deneme (retry) mantığı ekleyin ve sunucunun desteklediği protokolleri SSL denetleme aracıyla doğrulayın. Yapılandırma sorunlarında SSL sorun giderici yol gösterebilir.
Ek notlar
- Hata aralıklı oluşuyorsa arkadaki yük dengeleyicilerden yalnızca biri sorunlu olabilir; her ucu ayrı deneyin.
- Bundler veya sistem Ruby'sinin hangi OpenSSL'e bağlandığı farklı olabilir;
ruby -vve OpenSSL sürümünü birlikte kontrol edin. - Aynı sunucuya curl ile başarıyla bağlanıyorsanız fark büyük olasılıkla Ruby'nin OpenSSL sürümü veya yapılandırmasındadır.
Bu ayrım, sorunun kodda mı yoksa ortamda mı olduğunu hızla gösterir.
Özet: SYSCALL hatası çoğunlukla protokol uyumsuzluğu, eksik SNI veya ağ katmanında kesilen bağlantıdır; openssl s_client ile ayrıştırmak en hızlı yoldur.