Исторически смог установить переменную среды ssl_cert_file для использования этого сертификата и urllib.request.urlopen () работает просто нормально. Это верно до Python 3.12. Однако с Python 3.13 первый сценарий ниже не может открыть указанный URL. Чтобы получить тот же результат в Python 3.13, я должен использовать второй сценарий ниже (в основном, нахождение самоподнебленного файла сертификата самостоятельно, построить SSLContext с этим файлом и передавая его Urlopen).
Код, который работает в Python
Код: Выделить всё
#!/usr/bin/env python
import os
import ssl
from urllib.request import urlopen
if __name__ == "__main__":
url = "https://docs.python.org/3.10/library/ssl.html#module-ssl"
with urlopen(url) as fh:
data = fh.read()
print(f"Retrieved {len(data)} bytes.")
< /code>
Чтобы воспроизвести это поведение в Python 3.13, я должен изменить код: < /p>
#!/usr/bin/env python
import os
import ssl
from urllib.request import urlopen
if __name__ == "__main__":
url = "https://docs.python.org/3.10/library/ssl.html#module-ssl"
cafile = os.getenv("SSL_CERT_FILE")
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.load_verify_locations(cafile=cafile)
with urlopen(url, context=context) as fh:
data = fh.read()
print(f"Specifying CERT file: retrieved {len(data)} bytes.")
Подробнее здесь: https://stackoverflow.com/questions/791 ... -by-design