Heroku'da Redis 6 için SSL hatası nasıl çözülür?

Bu yazıyı Roam Research veya Github Pages üzerinden İngilizce okuyabilirsiniz.

Eğer bir Ruby on Rails uygulamasını Heroku Redis eklentisiyle (Hobby Dev planı hariç) bağlamaya çalışırsanız, aşağıdaki hatayla karşılaşma olasılığınız çok yüksek:

OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: 
certificate verify failed (self signed certificate in certificate chain)

Sebep

Redis 6 ve üzeri sürümleri bağlanmak için TLS kullanılmasını gerektirir. Ancak, Heroku kendi içinde SSL kullanmıyor. SSL’i yönlendirici (router) düzeyinde sonlandırıp, HTTP aracılığıyla istekleri uygulamanıza yönlendirirler ve tüm bunlar Heroku’nun güvenlik duvarının arkasında gerçekleştiği için de bu yöntem güvenlidir. Ayrıca, kabul edelim, Heroku’nun güvenlik önlemleri muhtemelen sizinkinden daha iyidir.

Çözüm

Bunu düzeltmek için Redis istemcinizde (client) OpenSSL::SSL::VERIFY_NONE kullanmanız gerekecek.

Redis.new(
  url: 'url',
  driver: :ruby,
  ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE }
)

Sidekiq kullanıyorsanız, yapılandırma (configuration) Sidekiq başlatıcıları (initializers) aracılığıyla yapılmalıdır:

# config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
  config.redis = { ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end

Sidekiq.configure_client do |config|
  config.redis = { ssl_params: { verify_mode: OpenSSL::SSL::VERIFY_NONE } }
end

Sık Karşılaşılan Sorunlar

Redis 6 ile hiç hata yok!?

Neden?

Redis sürümünü iki kez kontrol ettiğinizi varsayarsak, plan muhtemelen hem HTTP hem de HTTPS bağlantılarını destekleyen Hobby Dev sürümündedir.

Çözüm

Hobby Dev planı için uygulamanın “Config Vars” bölümünde ayarlanmış iki ortam değişkeni görmelisiniz. Eklentiyi Hobby Dev olarak tutmayı planlıyorsanız, herhangi bir değişiklik yapmanız gerekmez.

Eklentiyi Premium 0 veya üstüne yükseltmeyi planlıyorsanız, yukarıdaki gibi “VERIFY_NONE” kullanmanız gerekir.

Kaynaklar

Geçen aynı konuyu Speedshop’un Slack kanalında konuşuyorduk. Thread’de paylaşılan siteleri (İngilizce) bende buradan paylaşayım istedim:

2 Beğeni