Почему возникают ошибки SSL-соединения? | Serverspace
Часто, устанавливая SSL-сертификат, можно встретиться с множеством проблем, мешающим нормально функционировать протоколу HTTPS.
В нашем блоге мы разберем самые частые проблемы с SSL, способы их решения.
Так что же из себя представляет SSL? SSL, он же Secure Socket Layer — это интернет-протокол, который создает закрытое соединение на пути пользователь/сервер.
Если вы подключаетесь к ресурсу, тот он отправляет запрос серверной информации о сертификате. Он же отвечает положительно, если сертификат присутствует. Затем браузер получает этот же сертификат. После этого, проверяется название, период действия сертификата, корневой сертификат.
Причины ошибок SSL соединения
Если работа сертификата — выполняется правильно, то браузерная строчка будет иметь специальный значок:
Если же ошибки присутствуют, то будет выглядеть это будет по-другому:
Основными причинами данных проблем могут быть:
- Дата и время на вашем девайсе установлены неправильно;
- SSL сертификат является ненадежным;
- Брандмауэр или антивирус, не позволяющие получить доступ к ресурсу;
- Использование QUIC;
- Старая версия ОС;
- Старые, устаревшие сертификаты ;
- Появление проблемы «Invalid CSR» при генерации сертификата из панели управления облачного провайдера.
Теперь, о каждой в отдельности.
Проблема связанная с некорректными датой и временем
Период действия сертификата не сможет считаться, если на вашем девайсе стоит время и дата не соответствующие действительности.
Если причина проблемы именно в этом, то браузер выведет вам сообщение о некорректной дате и времени, как представлено на скриншоте ниже:
Чтобы избавиться от данного предупреждения, следует скорректировать время на вашем девайсе. После перезагрузки странички, проблема должна пропасть.
Проблема «Unsecured SSL-sertificate»
Случается так, что, когда вы переходите на веб-ресурс защищенный протоколом HTTPS, может появиться предупреждение о том, что «SSL-сертификат сайта не заслуживает доверия».
Установленное некорректное время, которое мы разобрали выше- одна из причин данной проблемы. Другая же причина может заключаться в том, что вы не обладаете корневым сертификатом. Чтобы исправить это, вы должны установить специальный пакет GeoTrust Primary Certification Authority, в котором и будет наш недостающий корневой сертификат.
Чтобы сделать это — после скачки вам надлежит:
- Сочетанием Win+R вывести командную строку и ввести в нее данную команду certmgr.msc. Далее нажимаем «Ок». У вас откроется окно с центром сертификатов.
- Далее, вам следует открыть пул «Доверенные корневые центры сертификации» слева. После, выберите папку «Сертификаты», кликаем по ней ПКМ, затем кликаем по «Все задачи — импорт».
- После этого у вас запустится визард импорта сертификатов. Кликаем по кнопке «Далее».
- Затем выбираем меню «Обзор» и указываем загруженный нами корневой сертификат. Кликаем по «Далее»:
- После открытия следующего окна, следует указать пункт «Поместить все сертификаты в следубщее хранилище»/ Затем нажимаем «Далее». Вы успешно импортировали ваш сертификат.
Затем перезагрузитесь и проверьте — нет ли у вас больше данной проблемы.
Брандмауэр или антивирус, блокируют ваш веб-ресурс
Иногда брандмауэр может блокировать ресуры. Чтобы проверить блокирует ли ваш брандмауэр определенный из них, вы должны отключить его и перезайти на сайт еще раз.
Если же вы смогли подключиться, то вам нужно внести его в список надежных веб-ресурсов, и тогда он будет работать даже при включенном брандмауэре.
Также ваш сертификат может быть блокирован вашим антивирусным средством. Если это так, то отключите в нем проверку протоколов SSL и HTTPS, после чего попытайтесь зайти на веб-ресурс.
Если это необходимо, то добавьте исключение для антивируса в виде необходимого нам ресурса.
Включен протокол QUIC
QUIC — протокол, который еще находиться на экспериментальной стадии. Он обеспечивает быстрое подключение к интернету. Его основной функцией является поддержка нескольких соединений. Данный протокол вы можете выключить в браузерной конфигурации.
Сейчас мы вам покажем, как отключить данный протокол в Google Chrome:
- Открыв поисковую машину, введите команду chrome://flags/#enable-quic;
- В появившемся окне будет выделено: Experimental QUIC protocol. Справа от данного параметра у вас будет меню, в котором надлежит будет поменять опцию на: Disable.
- Далее сделайте ребут, и проблема должна будет пропасть.
Данный способ работает как на Mac OS от Apple, так и в ОС от Microsoft.
Старая версия вашей ОС
SSL может выдавать ошибку по причине того, что у вас старая версия или необновленная ОС. Чаще всего она появляется на старых версиях Windows.
Для того чтобы избавиться от данной проблемы, все что вам нужно сделать — установить обновление на вашу ОС. После этого проверьте стал ли корректно работать SSL-сертификат.
Использование SSL-сертификата версии 3.0
Иногда данная проблема может появиться из-за использования веб-ресурсами устаревшего SSL-протокола версии 3.0. Для того чтобы браузер стал поддерживал устаревший протокол, вам нужно выполнить данные пункты:
- Вы должны откройть браузер и в нем открыть«Настройки».
- Проскрольте вниз по страничке и выберите пункт «Дополнительные».
- В нем найдите раздел «Система» и выберите параметр «Настройки прокси-сервера» и с помощью ПКМ откройте его.
Откроется окно параметров, где вы можете настроить свой прокси.
- Затем переключите нужный вам параметр. Затем кликните по «Ok» и далее выполните перезагрузку браузера.
Ошибки «Invalid CSR» при генерации сертификата из панели управления облачного провайдера
Пока вы будете активировать сертификат, есть шанс получить данную проблему: «Invalid CSR». Причинами данной проблемы могут быть:
- Некорректное имя FQDN, как Common Name. В этом поле нужно указать полное доменное имя по типу: domain.com или subdomain.domain.com (для субдоменов). Имя домена должно указываеться без https://. Вы не можете использовать интранет-имена (text.local). Для запроса wildcard-сертификатов доменное имя надлежит указывать как *.domain.com.
- Если в вашем CSR или пароле использованы какие либо буквы или цифры, кроме латиницы, специальные символы также не могут быть использованы в нем. Также это распространяется и на пароли для пары CSR/RSA.
- Если у вас некорректно указан код страны. Код страны должен быть двухбуквенным. Например: UK, IO, BY и т.п.
- Если в управлящей строке некорректное количество символов. CSR-запрос должен начинаться с управляющей строки ——BEGIN CERTIFICATE REQUEST—— и заканчиваться управляющей строкой ——END CERTIFICATE REQUEST——. С каждой стороны у этих строк должно быть по 5 дефисов.
- Если в начале или в конце строки CSR некорректно стоят пробелы. В конце строки CSR нельзя использовать пробел.
- При некорректном количестве символом в ключе. Его вес должен быть больше 256 байт.
- Если В CRS-коде для сертификата для одного доменного имени использовано некорректное имя. Например SAN-имя. В CSR-коде для сертификата, предназначенного защитить одно доменное имя, не должно быть SAN (Subject Alternative Names). SAN-имена указываются для мультидоменных (UCC) сертификатов.
- Если вы пересоздали или увеличили срок сертификата, и поле Common Name притерпело изменения. Данное поле должно оставаться постояннымЭто поле не должно меняться.
Почему возникают ошибки SSL-соединения и как их исправить?
SSL — протокол защищенного соединения, представляет собой шифрование передаваемой информации между веб-сайтом и браузером, который гарантирует безопасность и конфиденциальность личных данных пользователей.
Наличие ssl сертификата на сайте повышает доверие потенциальных клиентов, особенно, если на сайте используются платежные шлюзы, формы авторизации с вводом личных данных, учетные записи пользователей с личными паролями.
Если вы ещё не заказали и не установили ssl сертификат на свой сайт рекомендуем это сделать прямо сейчас.
Так что же делать, если вы открыли страницу в браузере и появилась ошибка подключения ssl?
Ошибки SSL-соединения и их устранение
Давайте разберемся почему возникает ошибка SSL и как правильно осуществить настройку браузера и системы, чтобы избежать этой проблемы.
Сбой актуальных даты и времени
Браузеры сверяют дату и время на вашем компьютере, с целью удостоверится, что срок действия сертификата не истек.
Поэтому, если дата и время не соответствует текущему, вы получите ошибку SSL-соединения.
В данном случае, браузер сам указывает возможный род ошибки и сообщает, что необходимо установить корректную дату и время.
Чтобы устранить ошибку нужно установить актуальные дату и время на своем устройстве, и перезагрузить браузер или запрашиваемую веб-страницу.
SSL-сертификат не вызывает доверия
Если вы открыли сайт и получили уведомление о том что «SSL-сертификат сайта не заслуживает доверия». Появится она может также из-за установленных неправильно даты и времени или же, в случае, если браузер не имеет возможности проверить цепочку сертификата, так как нет корневого сертификата.
Чтобы избавится от ошибки в данном случае необходимо скачать и установить GeoTrust Primary Certification Authority, в котором содержатся корневые сертификаты.
Чтобы открыть центр сертификатов, сочетанием клавиш Win+R вызываем терминал и вводим команду certmgr.msc
кликаем Ok.
Находим раздел «Доверенные корневые центры сертификации» переходим в «Сертификаты», нажимаем правой кнопкой мышки, чтобы открыть выплывающий список опций и выбираем «Все задачи — импорт».
После запуска импорта кликаем Далее.
После чего кликаем Обзор и выбираем загруженный сертификат.
В диалоговом окне указываем размещение Доверенные корневые центры сертификации.
Проверяем отображение сайта, после перезагрузки компьютера.
Данный метод рекомендуется использовать только при крайней необходимости, так как настройка может сильно повлиять на безопасность системы. Проделывать советуем только для доверенных надежных сайтов (Google, Яндекс и т.п.)
Брандмауэр или антивирус, блокирующие сайт
Брандмауэр может блокировать некоторые сайты.
Чтобы убедится, что дело именно в нём, нужно отключить временно брандмауэр и проверить работу сайта.
В Internet Explorer есть возможность добавить сайт в список надежных, тем самым исключив его проверку. Данные действия не рекомендованы, так как снижают безопасность устройства.
Также стоит проверить не происходит ли блокировки со стороны антивируса.
Проверяем временно отключив антивирус (либо отключив проверку протоколов SSL и HTTPS — данный момент особенно касается установленных самоподписанных сертификатов и Let’s Encrypt), после чего зайти на сайт.
В данном случае можно исключить сканирование антивирусной программы сайта.
Включенный экспериментальный протокол QUIC
QUIC — это новый протокол, используется для быстрого подключения к интернету. Основой QUIC есть поддержка нескольких соединений. Вы можете отключить этот протокол в конфигурации вашего браузера.
Для примера, как отключить QUIC, воспользуемся самым популярным браузером Google Chrome:
Открываем браузер и вводим команду chrome://flags/#enable-quic;
В окне находим параметр: Experimental QUIC protocol. В выпадающем меню выбираем опцию Disable.
Перезагружаем браузер. Проверяем работу сайтов.
Это универсальный способ для Windows и MacOS.
Отсутствие обновлений операционной системы
В случае, если системные обновления давно не производились, это может привести к ошибке SSL-соединения. Данная проблема особенно касается старых версий ПО Windows (7, Vista, XP и т.п.)
Обновите систему и проверьте работу защищенного соединения.
Ошибки «Invalid CSR» при генерации сертификата
Если в процессе генерации сертификата у вас возникла ошибка «Invalid CSR», то она может быть в результате следующих причин:
- Неверно указан домен (доменное имя указываем вида domain.com и subdomain.domain.com (в случае наличия субдоменов). Без уточнения www. или http://
- Для wildcard-сертификатов доменное имя должно быть вида *.domain.com.
- CSR и пароль должны состоять исключительно из латинских букв и цифр. Если присутствуют спецсимволы или не латинские буквы, будет возникать ошибка.
- Неверно указан код страны. Код страны состоит из двухбуквенного ISO 3166-1 кода (например, UA, US и т. д.).
- CSR-запрос начинается и заканчивается управляющей строкой ( ——BEGIN CERTIFICATE REQUEST——) ( ——END CERTIFICATE REQUEST——).
- Прописывается строка без пробелов вначале и в конце.
- Длина ключа не меньше 2048 бит.
- В CSR-коде для сертификата, с поддержкой защиты одного домена, нельзя указывать Subject Alternative Names. SAN-имена присутствуют только для мультидоменных (UCC) сертификатов.
- При перевыпуске или продлении сертификата изменилось поле Common Name. Это поле не должно меняться.
Вывод
Мы рассмотрели наиболее распространенные причины ошибок подключения SSL (Secure Socket Layer) протокола и варианты их решения. Надеемся, что следуя нашим инструкциям, вам удалось найти решение проблемы и продолжить безопасно пользоваться сетью Интернет.
Помните, что переходить по сайтам без защищенного соединения может быть небезопасно.
цель c — ошибка терминала при подключении SSL-сертификата и закрытого ключа для установки безопасного соединения:
Спросил
Изменено 4 года, 3 месяца назад
Просмотрено 19 тысяч раз
16
Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.
я пытаюсь сделать push-уведомление в своем приложении и перейти по этой ссылке http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-part-12
моя система была успешно подключена к telnet, но когда я ввожу запрос на подключение сертификата ssl и закрытого ключа, я обнаружил ошибку
$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev -cert.pem -ключ apns-dev-key.pem не удалось загрузить файл закрытого ключа сертификата клиента 1301: ошибка: 0906D06C: подпрограммы PEM: PEM_read_bio: нет стартовой строки:/SourceCache/OpenSSL098/OpenSSL098-44/src/crypto/pem/pem_lib.c:648: Ожидается: ЛЮБОЙ ЧАСТНЫЙ КЛЮЧ
кто-нибудь может сказать мне, что за ошибка и как ее решить?
Заранее спасибо. .com:2195 -сертификат push_development.pem
Ключевой частью является выбор сертификата и секретного ключа при экспорте .p12 из Keychain Access (вам будет предложено ввести 3 пароля, один для . p12, один для сертификата, один для закрытого ключа ).
Чтобы преобразовать .p12 в .pem, следуйте инструкциям Apple:
openssl pkcs12 -in CertificateName.p12 -out CertificateName.pem -nodes
1
Сначала я тоже столкнулся с этой проблемой.
У нас есть два файла
1) один aps_development.cer
от apple
2) Еще 1 из связки ключей доступа
с общим именем, которое мы только что создали.
После этого оба конвертируют его в файлы .pem
.
Например, cert.pem
и key.pem
.
После этого объедините эти два файла, используя приведенную ниже команду
cat cert.pem key.pem > ck.pem.
Сначала я открываю sl, используя приведенную ниже команду.
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert cert.pem -key key.pem
Что возвращает мне упомянутую вами ошибку. После этого я пытаюсь использовать
openssl s_client -connect gateway. sandbox.push.apple.com:2195 -cert cert.pem -key ck.pem
Значит уже работает. Надеюсь это поможет.
2
Я столкнулся с той же проблемой, когда генерировал файл PEM для корпоративного распространения, но позже я понял, что создал файл p12 для
Здравствуйте. Пожалуйста, следуйте приведенным ниже командам.
шаг 1 openssl pkcs12 -clcerts -nokeys -out developer_key.pem -in developer_key.p12
Примечание: просто перетащите путь к файлу на терминал…
step2 openssl pkcs12 -nocerts -out apns_key.pem -in apns_key.p12
step3 openssl pkcs12 -in developer_key.p12 -out developer_key.pem -nodes -clcerts
step4 openssl pkcs12 -in apns_key. p12 -out apns_key.pem -nodes -clcerts
шаг 5 cat apns_key.pem developer_ket.pem >developer.pem
Выполните тот же шаг для сертификатов распространения
После создания developer.pem и Distribution.pem
Проверьте оба файла в приведенных ниже командах.
Шаг 6 openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert developer.pem -debug -showcerts -CAfile "Entrust.net.Certification Authority (2048).pem
Уведомление: Парольная фраза должна быть длиннее чем 3 символа
Я только что исправил пароль Фраза 1234 😀
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя адрес электронной почты и пароль
Опубликовать как гость
Электронная почта
Требуется, но никогда не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
python — urllib и ошибка «SSL: CERTIFICATE_VERIFY_FAILED»
Asked
Изменено 13 дней назад
Просмотрено 999 тысяч раз
407
Новинка! Сохраняйте вопросы или ответы и организуйте свой любимый контент.
Узнать больше.
Я получаю следующую ошибку:
Исключение в потоке Thread-3: Traceback (последний последний вызов): Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", строка 810, в __bootstrap_inner самозапуск() Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", строка 763, выполняется self.__target(*self.__args, **self.__kwargs) Файл "/Users/Matthew/Desktop/Skypebot 2.0/bot.py", строка 271, в процессе информация = urllib2.urlopen(req).read() Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", строка 154, в urlopen вернуть opener.open(url, данные, время ожидания) Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", строка 431, открыт ответ = self._open (требование, данные) Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", строка 449., в _open '_открыть', требуется) Файл "/Library/Frameworks/Python.framework/Versions/2. 7/lib/python2.7/urllib2.py", строка 409, в _call_chain результат = функция (*аргументы) Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", строка 1240, в https_open контекст=я._контекст) Файл "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", строка 1197, в do_open поднять URLError (ошибка) URLError: <ошибка открытия URL [SSL: CERTIFICATE_VERIFY_FAILED] ошибка проверки сертификата (_ssl.c:581)>
Это код, вызывающий эту ошибку:
if input.startswith("!web"): ввод = ввод.заменить ("! сеть ", "") url = "https://domainsearch.p.mashape.com/index.php?name=" + ввод req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXX' }) информация = urllib2.urlopen(req).read() Сообщение.Чат.SendMessage("" + информация)
API, который я использую, требует использования HTTPS. Как сделать так, чтобы он не проходил проверку?
- питон
- python-2.7
- ssl
- ssl-сертификат
- urllib
11
Это не решение вашей конкретной проблемы, но я размещаю его здесь, потому что эта тема является самой популярной в результатах Google для «SSL: CERTIFICATE_VERIFY_FAILED», и это привело меня в погоню за дикими гусями.
Если вы установили Python 3.6 в OSX и получаете сообщение об ошибке «SSL: CERTIFICATE_VERIFY_FAILED» при попытке подключения к сайту https://, это, вероятно, связано с тем, что Python 3.6 в OSX вообще не имеет сертификатов и не может их проверить. любые SSL-соединения. Это изменение для версии 3.6 на OSX и требует шага после установки, который устанавливает certifi
пакет сертификатов. Это задокументировано в файле ReadMe.rtf, который вы можете найти по адресу /Applications/Python\ 3.6/ReadMe.rtf
(см. также файл Conclusion.rtf и скрипт build-installer.py
, который создает macOS установщик).
В файле ReadMe вы должны запустить сценарий после установки по адресу
/Applications/Python\ 3.10/Install\ Certificates.command
(приложение терминала, эта команда сама по себе должна решить проблему. Обязательно обновите путь к файлу используя вашу текущую подрывную деятельность.)
(его источник install_certificates. command
), который:
- сначала устанавливает пакет Python
certifi
и Затем - создает символическую ссылку из файла сертификатов OpenSSL на файл сертификатов, установленный пакетом
certifi
.
В примечаниях к выпуску есть дополнительная информация: https://www.python.org/downloads/release/python-360/
В более новых версиях Python есть дополнительная документация по этому поводу:
- https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/ReadMe.rtf#L22-L34
- https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/Conclusion.rtf#L15-L19
- https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/Welcome.rtf#L23-L25
- https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/resources/install_certificates. command
- https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/README.rst
- https://github.com/python/cpython/blob/e05a703848473b0365886dcc593cbddc46609f29/Mac/BuildScript/build-installer.py#L239-L246
31
Если вы просто хотите обойти проверку, вы можете создать новый SSLContext. По умолчанию вновь созданные контексты используют CERT_NONE.
Будьте осторожны с этим, как указано в разделе 17.3.7.2.1
При прямом вызове конструктора SSLContext по умолчанию используется CERT_NONE. Поскольку он не аутентифицирует другого узла, он может быть небезопасным, особенно в режиме клиента, где большую часть времени вы хотели бы убедиться в подлинности сервера, с которым вы разговариваете. Поэтому в режиме клиента настоятельно рекомендуется использовать CERT_REQUIRED.
Но если вы просто хотите, чтобы он работал сейчас по какой-то другой причине, вы можете сделать следующее, вам придется импорт ssl
, а также:
input = input. replace("!web ", "") url = "https://domainsearch.p.mashape.com/index.php?name=" + ввод req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' }) gcontext = ssl.SSLContext() # Только для гангстеров информация = urllib2.urlopen(req, context=gcontext).read() Сообщение.Чат.SendMessage("" + информация)
Это должно обойти вашу проблему, но на самом деле вы не решаете ни одну из проблем, но вы не увидите [SSL: CERTIFICATE_VERIFY_FAILED]
, потому что вы не проверяете сертификат!
В дополнение к вышесказанному, если вы хотите узнать больше о том, почему вы видите эти проблемы, вам следует взглянуть на PEP 476.
Этот PEP предлагает включить проверку подписей сертификата X509, а также проверку имени хоста для HTTP-клиентов Python по умолчанию с возможностью отказа для каждого вызова. Это изменение будет применено к Python 2.7, Python 3.4 и Python 3.5.
Существует рекомендуемый отказ, который не отличается от моего совета выше:
import ssl # Это восстанавливает то же поведение, что и раньше. контекст = ssl._create_unverified_context() urllib.urlopen("https://no-valid-cert", context=context)
Он также имеет крайне обескураживающую опцию с помощью monkeypatching, которую вы не часто видите в python:
import ssl ssl._create_default_https_context = ssl._create_unverified_context
Что переопределяет функцию по умолчанию для создания контекста с функцией для создания непроверенного контекста.
Обратите внимание на это, как указано в PEP:
Это руководство предназначено в первую очередь для системных администраторов, которые хотят внедрить более новые версии Python, реализующие этот PEP, в устаревших средах, которые еще не поддерживают проверку сертификатов при HTTPS-соединениях. Например, администратор может отказаться, добавив указанный выше обезьяний патч в sitecustomize.py в своей стандартной операционной среде для Python. Приложения и библиотеки НЕ ДОЛЖНЫ широко использовать этот процесс изменения (за исключением, возможно, ответа на параметр конфигурации, контролируемый системным администратором).
Если вы хотите прочитать статью о том, почему отказ от проверки сертификатов — это плохо в программном обеспечении, вы можете найти ее здесь!
9
Чтобы расширить ответ Крейга Гленни:
в Python 3.6.1 на MacOs Sierra
Ввод этого в терминал bash решил проблему:
pip install certifi /Приложения/Python\ 3.6/Установить\ Сертификаты.команда
5
В Windows Python не смотрит на системный сертификат, он использует свой собственный, расположенный по адресу ?\lib\site-packages\certifi\cacert.pem
.
Решение вашей проблемы:
- скачать сертификат проверки домена в виде файла *.crt или *pem
- открыть файл в редакторе и скопировать его содержимое в буфер обмена
- найдите свой
cacert.pem
location:from request.utils import DEFAULT_CA_BUNDLE_PATH; печать (DEFAULT_CA_BUNDLE_PATH)
- отредактируйте файл
cacert. pem
и вставьте сертификат проверки домена в конец файла. - Сохраните файл и наслаждайтесь запросами!
8
У меня была аналогичная проблема, хотя я использовал urllib.request.urlopen
в Python 3.4, 3.5 и 3.6 . (Это часть эквивалента Python 3 urllib2
, согласно примечанию в заголовке страницы документации Python 2 urllib2
.)
Мое решение состояло в том, чтобы pip install certifi
установить certifi
, который имеет:
… тщательно отобранная коллекция корневых сертификатов для проверки надежности сертификатов SSL при проверке подлинности хостов TLS.
Затем в моем коде, где я ранее только что имел:
импортировать urllib.request как urlrq resp = urlrq.urlopen('https://example.com/bar/baz.html')
Я изменил его на:
импортировать urllib. request как urlrq сертификаты импорта resp = urlrq.urlopen('https://example.com/bar/baz.html', cafile=certifi.where())
Если я правильно прочитал документацию urllib2.urlopen
, у нее также есть аргумент cafile
. Таким образом, urllib2.urlopen([...], certifi.where())
может работать и для Python 2.7.
ОБНОВЛЕНИЕ (01.01.2020): Начиная с Python 3.6 аргумент cafile
для urlopen
устарел, вместо него должен быть указан аргумент контекста . Я обнаружил, что следующие устройства одинаково хорошо работают на версиях от 3.5 до 3.8:
импортировать urllib.request как urlrq сертификаты импорта импорт SSL resp = urlrq.urlopen('https://example.com/bar/baz.html', context=ssl.create_default_context(cafile=certifi.where()))
5
Мое решение для Mac OS X:
1) Обновите до Python 3.6.5 с помощью встроенного установщика Python, загруженного с официального веб-сайта языка Python https://www. python.org/downloads/
Я нашел что этот установщик заботится об обновлении ссылок и символических ссылок для нового Python намного лучше, чем homebrew.
2) Установите новый сертификат, используя «./Install Certificates.command», который находится в обновленном каталоге Python 3.6
> cd «/Applications/Python 3.6/» > sudo "./Установить сертификаты.команда"
3
Вы можете попробовать добавить это к своим переменным среды:
PYTHONHTTPSVERIFY=0
Обратите внимание, что это отключит проверку всех HTTPS, так что это немного кувалдный подход, однако, если проверка не требуется, это может быть эффективным решением.
5
У меня была похожая проблема на одной из моих машин с Linux. Создание новых сертификатов и экспорт переменной среды, указывающей на каталог сертификатов, исправили это для меня:
$ sudo update-ca-certificates --fresh $ экспортировать SSL_CERT_DIR=/etc/ssl/certs
1
запросов на импорт запросы. пакеты.urllib3.disable_warnings() импорт SSL пытаться: _create_unverified_https_context = ssl._create_unverified_context кроме AttributeError: # Устаревший Python, который по умолчанию не проверяет сертификаты HTTPS проходить еще: # Обработка целевой среды, которая не поддерживает проверку HTTPS ssl._create_default_https_context = _create_unverified_https_context
Взято отсюда https://gist.github.com/michaelrice/a6794a017e349fc65d01
4
Как я уже писал в комментарии, эта проблема, вероятно, связана с этим ответом SO.
Вкратце: существует несколько способов проверки сертификата. Проверка, используемая OpenSSL, несовместима с доверенными корневыми сертификатами, которые есть в вашей системе. OpenSSL используется Python.
Вы можете попытаться получить отсутствующий сертификат для общедоступного первичного центра сертификации Verisign класса 3, а затем использовать опция cafile
согласно документации Python:
urllib2. urlopen(req, cafile="verisign.pem")
1
$ cd $ ГЛАВНАЯ $ wget --quiet https://curl.haxx.se/ca/cacert.pem $ экспорт SSL_CERT_FILE=$HOME/cacert.pem
Источник: https://access.redhat.com/articles/2039753
7
Моя установка — Anaconda Python 3.7 на MacOS с прокси-сервером. Пути разные.
- Вот как вы получаете правильный путь к сертификатам :
импорт SSL ssl.get_default_verify_paths()
, который в моей системе произвел
Out[35]: DefaultVerifyPaths(cafile='/miniconda3/ssl/cert.pem', capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/miniconda3/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/miniconda3/ssl/certs')
Как только вы узнаете, куда идет сертификат, вы присоедините сертификат, используемый прокси-сервером, к концу этого файла.
Я уже настроил conda для работы с моим прокси, выполнив:
conda config --set ssl_verify.crt
Если вы не помните, где находится ваш сертификат, вы можете найти его в ~/.condarc
:
ssl_verify:.crt
Теперь объедините этот файл в конец /miniconda3/ssl/cert.pem
и запросы должны работать, а в частности sklearn.datasets
и подобные инструменты
должно сработать.
Другие решения не сработали, поскольку настройка Anaconda немного отличается:
из request.utils import DEFAULT_CA_BUNDLE_PATH DEFAULT_CA_BUNDLE_PATH
1
Мне нужно добавить еще один ответ, потому что, как и Крейг Гленни, я пустился в погоню за дикими гусями из-за множества сообщений, посвященных этой проблеме в Интернете.
Я использую MacPorts, и то, что я изначально считал проблемой Python, на самом деле было проблемой MacPorts: он не устанавливает корневой сертификат при установке openssl. Решение port install curl-ca-bundle
, как упоминалось в этом сообщении в блоге.
Я удивлен, что все эти инструкции не решили мою проблему. Тем не менее, диагностика верна (кстати, я использую Mac и Python3.6.1). Итак, резюмируя правильную часть:
- На Mac Apple отказывается от OpenSSL .
- Python теперь использует собственный набор корневых сертификатов ЦС .
- Двоичная установка Python предоставила сценарий для установки необходимого Python сертификата CA Root ("/Applications/Python 3.6/Install Certificates.command")
- Подробнее см. в "/Applications/Python 3.6/ReadMe.rtf"
У меня скрипт не работает, и все эти установки certifi и openssl тоже не помогли. Может быть, потому что у меня несколько установок python 2 и 3, а также много virtualenv. В конце концов, мне нужно исправить это вручную.
pip install certifi # для вашей виртуальной среды mkdir -p /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl cp -a <ваша виртуальная среда>/site-package/certifi/cacert. pem \ /Библиотека/Фреймворки/Python.framework/Версии/3.6/и т.д./openssl/cert.pem
Если это все еще вас не устраивает. Затем переустановите OpenSSL.
установка порта openssl
Я нашел это здесь
Я нашел это решение, вставьте этот код в начало исходного файла:
import ssl пытаться: _create_unverified_https_context = ssl._create_unverified_context кроме AttributeError: # Устаревший Python, который по умолчанию не проверяет сертификаты HTTPS проходить еще: # Обработка целевой среды, которая не поддерживает проверку HTTPS ssl._create_default_https_context = _create_unverified_https_context
Этот код отменяет проверку, поэтому сертификация ssl не проверяется.
1
Ошибка SSL: CERTIFICATE_VERIFY_FAILED также может возникать из-за отсутствия промежуточного сертификата в пакете ca-certificates
в Linux. Например, в моем случае промежуточный сертификат « DigiCert SHA2 Secure Server CA » отсутствовал в пакете ca-certificates
, хотя браузер Firefox включает его. Вы можете узнать, какой сертификат отсутствует, запустив команда wget
для URL-адреса, вызывающего эту ошибку. Затем вы можете найти соответствующую ссылку на файл CRT для этого сертификата на официальном сайте (например, https://www.digicert.com/digicert-root-certificates.htm в моем случае) Центра сертификации. Теперь, чтобы включить сертификат, отсутствующий в вашем случае, вы можете выполнить следующие команды, используя вместо этого ссылку для загрузки файла CRT:
wget https://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt mv DigiCertSHA2SecureServerCA.crt DigiCertSHA2SecureServerCA.der OpenSSL x509-inform DER -outform PEM -in DigiCertSHA2SecureServerCA.der -out DigicertSHA2SecureServerCA.pem.crt sudo mkdir /usr/share/ca-сертификаты/дополнительно sudo cp DigicertSHA2SecureServerCA.pem.crt /usr/share/ca-certificates/extra/ sudo dpkg-reconfigure ca-сертификаты
После этого вы можете снова протестировать свой URL-адрес с помощью wget
, а также с помощью пакета python urllib
. Для получения дополнительной информации см.: https://bugs.launchpad.net/ubuntu/+source/ca-certificates/+bug/1795242
Думаю, у вас есть несколько способов решить эту проблему. Я упомянул 5 способов ниже:
- Вы можете определить контекст для каждого запроса и передать контекст по каждому запросу для его использования, как показано ниже:
сертификат импорта импорт SSL импортировать urllib контекст = ssl.create_default_context(cafile=certifi.where()) результат = urllib.request.urlopen('https://www.example.com', контекст=контекст)
- ИЛИ Установить файл сертификата в среде
импорт ОС сертификаты импорта импортировать urllib os.environ["REQUESTS_CA_BUNDLE"] = certifi.where() os.environ["SSL_CERT_FILE"] = certifi.where() результат = urllib.request.urlopen('https://www.example.com')
- ИЛИ Заменить
создать контекст HTTPS по умолчанию
метод:
сертификат импорта импорт SSL ssl. _create_default_https_context = лямбда: ssl.create_default_context(cafile=certifi.where()) результат = urllib.request.urlopen('https://www.example.com')
- ИЛИ Если вы используете Linux машина, генерирующая новые сертификаты и экспортирующая переменную среды, указывающую на каталог сертификатов, исправила это.
$ sudo update-ca-certificates --fresh $ экспортировать SSL_CERT_DIR=/etc/ssl/certs
- ИЛИ Если вы используете машину Mac , генерируя свежие сертификаты
$ cd "/Applications/$(python3 --version | awk '{print $2}'| awk -F. '{print "Python " $1"."$2}')" $ sudo "./Установить сертификаты.команда"
Python 2.7.12 (по умолчанию, 29 июля 2016 г., 15:26:22) исправил указанную проблему. Эта информация может помочь кому-то еще.
3
Взгляните на
/Applications/Python 3.6/Install Certificates. command
Вы также можете перейти в папку Applications
в Finder и щелкнуть Certificates.command
1
Для Python 3.4+ на Centos 6/7, Fedora просто установите доверенный ЦС следующим образом:
- Скопируйте CA.crt в
/etc/pki/ca-trust/source/anchors/
-
обновление-ка-доверие принудительное включение
-
извлечение обновления-ка-доверия
1
Как и вы, я использую python 2.7 на своем старом iMac (OS X 10.6.8), я тоже столкнулся с проблемой, используя urllib2.urlopen:
ошибка urlopen [SSL: CERTIFICATE_VERIFY_FAILED]
Мои программы работали нормально, без проблем с SSL-сертификатом, и внезапно (после загрузки программ) произошел сбой с этой ошибкой SSL.
Проблема заключалась в используемой версии Python:
Нет проблем с https://www. python.org/downloads и python-2.7.9-macosx10.6.pkg
проблема с программой, установленной с помощью инструмента Homebrew: «brew install python», версия находится в /usr/local/bin.
Глава под названием Проверка сертификата и OpenSSL [ИЗМЕНЕНО для Python 2.7.9]
в /Applications/Python 2.7/ReadMe.rtf
подробно объясняет проблему.
Итак, проверьте, скачайте и поместите в свой PATH нужную версию python.
1
Я полустыдно опускаю голову, так как у меня была та же проблема, за исключением того, что в моем случае URL-адрес, который я нажимал, был действителен, сертификат был действителен. Что было недействительным, так это мое подключение к сети. Мне не удалось добавить данные прокси в браузер (в данном случае IE). Это помешало правильному прохождению процесса проверки.
Добавлено в детали прокси, и мой питон был очень доволен.
1
Python 2. 7 на Amazon EC2 с CentOS 7
Мне пришлось установить переменную env SSL_CERT_DIR
, чтобы она указывала на мой пакет ca-bundle
, который находился по адресу /etc/ssl/certs/ca-bundle.crt
2
Бывают случаи, когда нельзя использовать незащищенные соединения или передавать ssl-контекст в запрос urllib. Здесь мое решение, основанное на https://stackoverflow.com/a/28052583/6709778
В случае, если вы хотите использовать свой собственный файл сертификата
импорт SSL def new_ssl_context_decorator(*args, **kwargs): kwargs['cafile'] = '/etc/ssl/certs/ca-certificates.crt' вернуть ssl.create_default_context(*args, **kwargs) ssl._create_default_https_context = ssl._create_unverified_context
или вы можете использовать общий файл из сертификата
def new_ssl_context_decorator(*args, **kwargs): сертификаты импорта kwargs['cafile'] = certifi. where() вернуть ssl.create_default_context(*args, **kwargs)
Установка PyOpenSSL
с использованием pip
работал у меня (без преобразования в PEM):
pip install PyOpenSSL
Я решил эту проблему, закрыв Fiddler (прокси-сервер отладки HTTP), проверьте, включен ли прокси-сервер, и повторите попытку.
В python 2.7 добавление сведений о доверенном корневом ЦС в конце файла C:\Python27\lib\site-packages\certifi\cacert.pem помогло
после этого я запустил (используя права администратора) pip install --trusted-host pypi.python.org --trusted-host pypi.org --trusted-host files.pythonhosted.org packageName
0
Установка certifi на Mac решила мою проблему:
pip install certifi
В моем случае я получал эту ошибку, потому что запросы версий
и urllib3
были несовместимы, что давало следующую ошибку во время установки:
ОШИБКА: запросы 2.