Python'un requests kütüphanesi, sertifika doğrulaması için sistem deposunu değil certifi paketinin CA paketini kullanır. Bu paket eskiyse veya farklı bir ortamda tanımsızsa, şu hata oluşur:
requests.exceptions.SSLError: HTTPSConnectionPool(...):
[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate
Olası nedenler
- Uzun süredir güncellenmemiş
certifisürümü; yeni bir kök CA pakette yok. - Sanal ortamda (venv) eski bir paket kalmış.
- macOS'ta python.org kurulumunun sertifikaları yüklenmemiş.
- Kurumsal proxy kendi kök sertifikasıyla trafiği yeniden imzalıyor.
- Sunucu ara sertifikayı göndermiyor.
Teşhis
Hangi paketin kullanıldığını görün:
python -c "import certifi; print(certifi.where(), certifi.__version__)"
Çözüm adımları
- Paketi güncelleyin:
python -m pip install --upgrade certifi requests urllib3
- macOS'ta python.org kurulumunda Uygulamalar klasöründeki Python dizininde bulunan
Install Certificates.commanddosyasını çalıştırın. - Kurumsal CA kullanılıyorsa kendi paketinizi tanıtın:
export REQUESTS_CA_BUNDLE=/etc/ssl/kurum-ca.pem
export SSL_CERT_FILE=/etc/ssl/kurum-ca.pem
Kodda ise requests.get(url, verify="/etc/ssl/kurum-ca.pem") biçiminde tek bir çağrı için de verebilirsiniz.
- Sunucu zinciri eksikse sorunu sunucu tarafında düzeltin; istemciyi değiştirmek yalnızca belirtiyi örter.
Kaçınılacak yol
verify=False kullanmak hatayı susturur ama bağlantının kimliğini doğrulamaz; üretimde kullanmayın. Sunucunuzun zinciri sorunluysa SSL kontrol aracı eksikleri gösterir, yeni bir sertifika gerekiyorsa SSL sertifikaları sayfasına bakabilirsiniz.