Ответ
SSL/TLS сертификат — это цифровой документ, который используется для подтверждения подлинности сервера и шифрования данных, передаваемых между клиентом и сервером по протоколу HTTPS.
Зачем он нужен? Основная задача — предотвратить атаки типа «человек посередине» (Man-in-the-Middle), гарантируя, что клиент общается именно с тем сервером, за который тот себя выдает.
Применение в Python:
Библиотеки, такие как requests и httplib, по умолчанию проверяют SSL-сертификат сервера при выполнении HTTPS-запроса. Если сертификат недействителен (просрочен, самоподписанный, выдан недоверенным центром сертификации - CA), выбрасывается исключение ssl.SSLCertVerificationError.
Пример работы с сертификатами в requests:
-
Небезопасное отключение проверки (только для отладки!):
import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning # Подавляем предупреждения о небезопасных запросах requests.packages.urllib3.disable_warnings(InsecureRequestWarning) # Этот запрос проигнорирует ошибки SSL, что небезопасно в production response = requests.get('https://self-signed.badssl.com/', verify=False) print(response.status_code) -
Правильный подход: указание пути к доверенному сертификату: Если вы работаете с внутренним сервисом, у которого есть свой сертификат, его следует добавить в доверенные.
import requests # Указываем путь к файлу сертификата (или бандлу сертификатов) response = requests.get('https://internal.service.com', verify='/path/to/your/ca.crt') print(response.status_code)
Ответ 18+ 🔞
Ага, вот эта вся хуйня с замочками в браузере, да? SSL/TLS сертификат — это, грубо говоря, цифровая бумажка, которая кричит: «Я не левый мудак, я тот самый сервер, за которого себя выдаю!». И заодно шифрует весь твой трафик, чтобы никто посторонний не подслушал, пока ты там котиков смотришь или пароли вводишь.
Нахуя это вообще нужно? Главная фишка — чтобы тебя не наебали. Представь, ты думаешь, что зашёл в свой банк, а на самом деле какой-то уёбок-посредник (Man-in-the-Middle) подсунул тебе свою поддельную страницу и теперь все твои данные у него. Сертификат как раз и не даёт этому случиться, подтверждая, что сервер — настоящий.
Как с этим жить в Python?
Библиотеки типа requests или стандартный httplib — они недоверчивые, как старые пердуны. По умолчанию они проверяют эту самую бумажку у сервера. Если она просрочена, самоподписана или её выдал какой-то левый центр сертификации (CA), который им не нравится — тут же орут ошибкой ssl.SSLCertVerificationError. И правильно делают, блядь!
Смотри, как это выглядит на практике с requests:
-
Тупой и опасный способ (только чтобы посмотреть, не для продакшена, ёпта!): Иногда, на тестовом стенде, сертификат самоподписанный, и тебе просто надо проверить, работает ли API. Можно проверку отключить, но это как ходить по минному полю в слепую.
import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning # Заткнём предупреждения, которые будут орать, что мы идиоты requests.packages.urllib3.disable_warnings(InsecureRequestWarning) # Ключевой момент: `verify=False`. Это наш белый флаг недоверию. response = requests.get('https://self-signed.badssl.com/', verify=False) print(response.status_code)Запомни: в реальном коде так делать — это пиздец какой риск. Ты открываешь себя для атаки.
-
Правильный, взрослый подход: Если у тебя есть внутренний сервис со своим сертификатом (например, в корпоративной сети), его нужно добавить в доверенные. Просто скажи
requests, где лежит файл с этим сертификатом.import requests # Вот так. Указываешь путь к файлу сертификата (`.crt`, `.pem`) или целой пачке их. response = requests.get('https://internal.service.com', verify='/path/to/your/ca.crt') print(response.status_code)Теперь библиотека будет доверять сертификатам, подписанным твоим внутренним центром, и не будет орать. Красота, да и только!
Короче, суть в чём: не отключай проверку просто потому, что лень. Либо используй сертификаты от нормальных центров (Let's Encrypt, блядь, бесплатные!), либо явно укажи свой доверенный. А то потом будешь удивляться, откуда у тебя данные уплыли.