requests.exceptions.SSLError: HTTPSConnectionPool(host='ornek.com', port=443): Max retries exceeded ... (Caused by SSLError(...)) ifadesi, tekrar deneme mesajıyla yanıltıcı olabilir; asıl neden parantez içindeki SSL ayrıntısındadır.
Ayrıntıya göre neden
- CERTIFICATE_VERIFY_FAILED: CA paketi (certifi) eski ya da zincir eksik.
- hostname doesn't match: URL'deki ad sertifikada yok.
- WRONG_VERSION_NUMBER: HTTPS portuna düz HTTP konuşuluyor ya da proxy ayarı hatalı.
- SSLV3_ALERT_HANDSHAKE_FAILURE / UNSAFE_LEGACY_RENEGOTIATION_DISABLED: Eski sunucu ile yeni OpenSSL uyumsuzluğu.
Çözüm yolları
- CA paketini yenileyin:
pip install --upgrade requests certifi - Kurumsal veya özel bir CA için dosya yolu verin:
import requests r = requests.get("https://ornek.com", verify="/yol/kok-ca.pem") - Tüm süreç için ortam değişkeni kullanın:
REQUESTS_CA_BUNDLE=/yol/kok-ca.pem. - Oturum düzeyinde tek yerde tanımlayın:
s = requests.Session() s.verify = "/yol/kok-ca.pem" - Proxy kullanıyorsanız
HTTPS_PROXYdeğerinin doğru şemayı (http:// ile proxy adresi) taşıdığından emin olun. - Sunucu yalnızca eski TLS sunuyorsa önce sunucuyu güncellemeyi deneyin; istemciye eski protokol zorlamak güvenlik açığı doğurur.
Kaçınılması gerekenler
verify=False kullanımı hata mesajını susturur ama ortadaki adam saldırılarına kapı açar; yalnızca yerel, geçici testlerde düşünülmelidir. Sunucu sertifikasının zincir durumunu SSL denetleme aracıyla görüp eksik ara sertifikayı sunucu tarafında tamamlamak en temiz çözümdür. Benzer sorunlar için SSL sorun giderici sayfasına da bakabilirsiniz.
Ek notlar
- Bir betik tek bir uç noktaya hata veriyor, diğerlerine vermiyorsa sorun istemcide değil o sunucunun zincirindedir.
- Tekrar deneme (retry) eklemek geçici ağ sorunlarında yardımcı olur, ancak sertifika hatasını çözmez.
- Docker ve CI ortamlarında
ca-certificatespaketinin kurulu olduğundan emin olun.
Tarayıcıda sorunsuz açılan bir adresin Python'da hata vermesi şaşırtıcı değildir: tarayıcılar eksik ara sertifikayı kendileri tamamlayabilir, requests tamamlamaz.
Özet: önce SSLError'un iç nedenini okuyun; çoğu durumda CA paketi ya da zincir düzeltilerek doğrulama açık bırakılabilir.