ssl 1.16
pip install ssl Copy PIP instructions
Released: Apr 20, 2013
SSL wrapper for socket objects (2.3, 2.4, 2.5 compatible)
Navigation
Project links
Statistics
View statistics for this project via Libraries.io, or by using our public dataset on Google BigQuery
License: Python (MIT-like)
Maintainers
Project description
The old socket.ssl() support for TLS over sockets is being superseded in Python 2.6 by a new ‘ssl’ module. This package brings that module to older Python releases, 2.3.5 and up (it may also work on older versions of 2.3, but we haven’t tried it).
It’s quite similar to the 2.6 ssl module. There’s no stand-alone documentation for this package; instead, just use the development branch documentation for the SSL module at http://docs.python.org/dev/library/ssl.html.
Version 1.0 had a problem with Python 2.5.1 – the structure of the socket object changed from earlier versions.
Version 1.1 was missing various package metadata information.
Version 1.2 added more package metadata, and support for ssl.get_server_certificate(), and the PEM-to-DER encode/decode routines. Plus integrated Paul Moore’s patch to setup.py for Windows. Plus added support for asyncore, and asyncore HTTPS server test.
Version 1.3 fixed a bug in the test suite.
Version 1.4 incorporated use of -static switch.
Version 1.5 fixed bug in Python version check affecting build on Python 2.5.0.
Version 1.7 (and 1.6) fixed some bugs with asyncore support (recv and send not being called on the SSLSocket class, wrong semantics for sendall).
Version 1.8 incorporated some code from Chris Stawarz to handle sockets which are set to non-blocking before negotiating the SSL session.
Version 1.9 makes ssl.SSLError a subtype of socket.error.
Version 1.10 fixes a bug in sendall().
Version 1.11 includes the MANIFEST file, and by default will turne unexpected EOFs occurring during a read into a regular EOF. It also removes the code for SSLFileStream, to use the regular socket module’s _fileobject instead.
Version 1.12 fixes the bug in SSLSocket.accept() reported by Georg Brandl, and adds a test case for that fix.
Version 1.13 fixes a bug in calling do_handshake() automatically on non-blocking sockets. Thanks to Giampaolo Rodola. Now includes real asyncore test case.
Version 1.14 incorporates some fixes to naming (rename “recv_from” to “recvfrom” and “send_to” to “sendto”), and a fix to the asyncore test case to unregister the connection handler when the connection is closed. It also exposes the SSL shutdown via the “unwrap” method on an SSLSocket. It exposes “subjectPublicKey” in the data received from a peer cert.
Version 1.15 fixes a bug in write retries, where the output buffer has changed location because of garbage collection during the interim. It also provides the new flag, PROTOCOL_NOSSLv2, which selects SSL23, but disallows actual use of SSL2.
Version 1.16 removes installing tests system-wide (which fixes the “permission denied” error when installing in virtualenvs), adds /usr/lib/i386-linux-gnu and /usr/lib/x86_64-linux-gnu to the search path (which fixes compilation on ubuntu 12.04) and stopped using SSLv2_method if it’s not present. Many thanks to Denis Bilenko for providing those fixes through his temporary sslfix fork.
The package is now maintained (bugfix only) by PyPA.
Authorship: A cast of dozens over the years have written the Python SSL support, including Marc-Alan Lemburg, Robin Dunn, GvR, Kalle Svensson, Skip Montanaro, Mark Hammond, Martin von Loewis, Jeremy Hylton, Andrew Kuchling, Georg Brandl, Bill Janssen, Chris Stawarz, Neal Norwitz, and many others. Thanks to Paul Moore, David Bolen and Mark Hammond for help with the Windows side of the house. And it’s all based on OpenSSL, which has its own cast of dozens!
Пишем SSL туннель на python
Возникла задача: есть приложение под Windows, которое делает HTTPS-запросы к серверу и получает ответы. После обновления сервера приложение перестало работать. Выяснилось, что на сервере изменилась версия SSL (перешли с SSLv3 на TLSv1), а наше приложение умеет работать только по SSLv3. Приложение никто не поддерживает уже давно и менять, перекомпилировать, тестировать не хотелось. Решено было сделать прослойку между приложением и сервером, которая будет транслировать SSLv3 в TLSv1 и наоборот. Я поискал какой-нибудь прокси в интернете, но сходу не нашел (плохо искал). Решил сделать прокси на питоне. Я не профессионал в питоне, но мне показалось что для этой задачи он хорошо подходит, и интересно параллельно по изучать питон на примере реальной задачи.
Начало
Итак, устанавливаем питон 3.4. Пишем скрипт, я для этого использовал блокнот. Для ssl-сокетов понадобится модуль ssl. Для, собственно, сокетов socket.
Создаем сокет, слушающий клиента, т.к. это будет SSL-сервер, то придется создать для него само-подписанный сертификат, который он будет предоставлять клиенту. Для создания сертификата, я использовал утилиту openssl. Скачал утилиту отсюда indy.fulgan.com/SSL. Для создания сертификата потребуется конфиг для утилиты, пример можно взять здесь web.mit.edu/crypto/openssl.cnf. Кладем конфиг в папку на компе и устанавливаем путь к нему (далее все действия в командной строке):
Генерим приватный ключ
Попутно будет предложено ввести пароль к ключу и подтверждение пароля, вводим. Создаем запрос на сертификат
При генерации запроса нам нужно будет ввести пароль ключа и заполнить информацию о компании, городе, стране и т.д. Заполняем. Для того, чтобы можно было использовать ключ без пароля, копируем его и распароливаем
Наконец, создаем самоподписанный сертификат
Для удобства кладем наш сертификат и ключ рядом со скриптом на питоне. Создаем сокет, который будет слушать клиента и ставим его слушать порт на который будет ходить наше приложение (далее код на питоне)
Получаем входящее соединение и запрос от клиента
Далее нам нужно полученные данные отправить на сервер, которому они предназначались. Создаем для этого сокет и шлем в него данные
Итак, запрос отправили, теперь нам надо получить респонз и отдать его нашему клиенту
Ну все наш прокси готов, запускаем, кидаем запрос — не работает! Для того чтобы выяснить почему, добавим логирование.
Подключим модуль logging, настроим конфигурацию логирования и добавим логирование в интересные места
Чтение всех данных
Оказалось что данные клиент передает по блокам, т.е. мы прочитали не полный запрос. Потом выяснится, что сервер также отдает ответ по блокам. Усовершенствуем наш код чтобы читать запрос и ответ по блокам. Для этого создаем буфер, в который будем складывать весь запрос, устанавливаем сокету таймаут 0.1 с, который он будет ждать данные от входящего соединения и в цикле читаем и складываем в буфер данные. Если данных не будет, то получим исключение и выйдем из цикла
То же для чтения данных от сервера
Меняем данные которые будем отправлять серверу и клиенту
Запускаем. Теперь работает, однако приходится запускать скрипт при каждом запросе к серверу, что не очень удобно.
Обработка нескольких запросов
Усовершенствуем скрипт, после обработки запроса будем снова слушать сокет
Это будет работать, однако есть проблема — у нас бесконечный цикл из которого программа не может выйти нормальным образом. Для выхода можно использовать клавиатурное прерывание Ctrl+C и отправим запрос, после этого программа завершится по исключению KeyboardInterrupt.
Чтобы обеспечить более-менее нормальный выход, я решил передавать в сокет STOP, это будет управляющей командой завершения. Напишем обработчик для такой команды. Для этого нам потребуется модифицировать код чтения из клиентского сокета. Получаем первые четыре байта и если они будут STOP, прерываем цикл.
Напишем функцию для остановки нашего прокси. В ней создадим сокет (ssl) и отправим STOP на наш прокси
Для запуска команды STOP будем использовать параметр командной строки. Если передали строку stop в командной строке, то будем вызывать нашу функцию stop() (Помещаем этот код и функцию стоп в начало, после установки формата логирования).
Теперь мы можем останавливать наш прокси тем же скриптом. Для того чтобы после остановки не выполнялся код запуска сервера, обернем основной код в функцию run, получится
Заодно обработали случай с неправильной командой.
Осталась проблема, при запуске нашего прокси приложение будет висеть в командной строке, на первый взгляд кажется, что оно зависло. Для решения этой проблемы сделаем демон. Т.к. у нас Windows, то демон тут делается запуском процесса без окна, этот код будет некроссплатформенным. Итак напишем функцию daemonize()
Здесь creationflags=0x08000000, установка флага CREATE_NO_WINDOW для процесса. Будем запускать наш сервис в режиме демона если передали start в командной строке
Теперь мы можем запускть наш сервис в режиме демона и останавливать.
Еще маленький штрих, добавим возможность обработки нескольких клиентов, для этого вынесем наш код работы с клиентом в отдельную функцию
А в главной функции будем запускать client_run в отдельном потоке, т.к. мы устанавливали socket.listen(10), то одновременно у нас может быть до 10 потоков
Теперь наш прокси-сервис готов.
PS: Позже мне коллега подсказал, что для моей задачи можно использовать stunnel, и я решил поставить его, а скрипт выложить сюда, вдруг кому будет интересно. Конфиг для stunnel такой:
С stunnel также пришлось повозиться, т.к. на сервере были некорректные настройки и не проходила верификация SNI, заработало только с версией 4.36, т.к. там нет такой верификации.
«Модуль ssl в Python недоступен» при установке пакета с помощью pip3
Я успешно установил Python 3.4 и Python 3.6 на свой локальный компьютер, но не могу устанавливать пакеты с расширением pip3 .
Когда я выполняю pip3 install
, я получаю следующую ошибку, связанную с SSL :
Как я могу исправить мою установку Python3.x, чтобы я мог устанавливать пакеты с помощью pip install
Пошаговое руководство по установке Python 3.6 и pip3 в Ubuntu
Установите необходимые пакеты для Python и ssl: $ sudo apt-get install libreadline-gplv2-dev libncursesw5-dev libssl-dev libsqlite3-dev tk-dev libgdbm-dev libc6-dev libbz2-dev
Загрузите и распакуйте «Python-3.6.8.tar.xz» с https://www.python.org/ftp/python/ в свой домашний каталог.
Откройте терминал в этом каталоге и запустите: $ ./configure
Сборка и установка: $ sudo make && sudo make install
Установите пакеты с помощью: $ pip3 install package_name
Если вы используете Red Hat / CentOS:
Если вы работаете в Windows и используете anaconda, это сработало для меня:
Я пробовал много других решений, которые не работали (изменения переменной PATH среды . )
Проблема может быть вызвана тем, что библиотеки DLL в папке Windows \ System32 (например, libcrypto-1_1-x64.dll или libssl-1_1-x64.dll или другие) размещены там другим программным обеспечением.
Исправление заключалось в установке openSSL с https://slproweb.com/products/Win32OpenSSL.html, который заменяет библиотеки DLL более поздними версиями.
У меня была аналогичная проблема с OSX 10.11 из-за установки memcached, который установил python 3.7 поверх 3.6.
ВНИМАНИЕ: pip настроен с местоположениями, требующими TLS / SSL, однако модуль ssl в Python недоступен.
Потратил часы на отключение openssl, переустановку, изменение путей .. и ничего не помогло. Смена версии openssl на более старую сработала:
Я нигде в Интернете не видел этого предложения. Надеюсь, это кому-то поможет.
Согласен с ответом mastaBlasta. Работал у меня. Я столкнулся с той же проблемой, что и в описании темы.
Среда: MacOS Sierra. И я использую Homebrew.
- Переустановите openssl с помощью brew uninstall openssl; brew install openssl
Согласно подсказкам Homebrew, сделайте следующее:
В Ubuntu это может помочь:
Понижение версии openssl сработало для меня,
Вероятно, проблема вызвана отсутствием библиотеки.
Перед установкой python 3.6 убедитесь, что вы установили все библиотеки, необходимые для python.
Если вы используете OSX и скомпилировали Python из исходного кода:
Установите openssl с помощью brew brew install openssl
Обязательно следуйте инструкциям по настройке CPPFLAGS и LDFLAGS . В моем случае я использую openssl@1.1 формулу пивоварения, и мне нужны эти 3 настройки для процесса сборки python, чтобы правильно ссылаться на мою библиотеку SSL:
Предполагая, что библиотека установлена в этом месте.
Я столкнулся с той же проблемой в Windows 10. Моя очень специфическая проблема связана с моей установкой Anaconda. Я установил Anaconda, и по пути Path/to/Anaconda3/ появляется файл python.exe . Таким образом, я вообще не устанавливал python, потому что Anaconda включает python. При использовании pip для установки пакетов я обнаружил тот же отчет об ошибке pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available. .
Решение было следующее:
1) вы можете повторно скачать python на официальном сайте ;
2) Перейдите в каталог, в котором «Python 3.7 (64-bit).lnk» находится
3) import ssl и exit()
4) введите cmd, «Python 3.7 (64-bit).lnk» -m pip install tensorflow например, .
Здесь все готово.
Если вы работаете в Windows и используете Anaconda, вы можете попробовать запустить команду «pip install . » в Anaconda Prompt вместо cmd.exe, как предлагает здесь пользователь willliu1995 . Для меня это было самое быстрое решение, не требующее установки дополнительных компонентов.
Я попытался МНОГО способов решить эту проблему, но ни один не решил. Сейчас я использую Windows 10.
Единственное, что сработало:
- Удалить Anaconda
- Удалите Python (я использовал версию 3.7.3)
- Установите Python еще раз (не забудьте отметить опцию автоматического добавления в PATH)
Затем я загрузил все необходимые библиотеки с помощью PIP . и работал!
Не знаю, почему и была ли проблема каким-то образом связана с Анакондой.
для пользователей osx brew
Моя проблема возникла, связанная с моей установкой Python, и была быстро решена путем повторной установки python3 и pip. я думаю, что он начал плохо себя вести после обновления ОС, но кто знает (в настоящее время я использую Mac OS 10.14.6)
Вы можете сделать одно из этих двух:
- При установке Anaconda выберите параметр, чтобы добавить Anaconda в путь .
или
- Найдите эти (полные) пути в папке установки Anaconda и добавьте их в переменную среды :
\ Анаконда \ Библиотека \ mingw-w64 \ bin
\ Анаконда \ Библиотека \ usr \ bin
\ Anaconda \ Library \ bin
Добавьте указанные выше пути в системную переменную «Path», и ошибка больше не должна отображаться 🙂
У меня была такая же проблема, и я смог ее решить, выполнив следующие действия:
в зависимости от химической завивки вам может не понадобиться sudo.
теперь должен быть в состоянии запустить
При установке пакетов:
или, в зависимости от perms, вы также можете добавить флаг —user следующим образом:
ssl Модуль является TLS / SSL обертка для доступа к операции Sytem (OS) гнездо ( Lib / ssl.py ). Поэтому, когда ssl модуль недоступен, есть вероятность, что у вас либо не установлены библиотеки OpenSSL ОС, либо эти библиотеки не были найдены при установке Python. Предположим, что это более поздний случай (он же: у вас уже установлен OpenSSL, но они неправильно связаны при установке Python).
Я также предполагаю, что вы устанавливаете из исходников. Если вы производите установку из двоичного файла (например, из файла Window .exe) или пакета (Mac .dmg или Ubuntu apt), вы мало что можете сделать с процессом установки.
На этапе настройки вашей установки python вам необходимо указать, где OS OpenSSL будет использоваться для связывания:
Итак, где вы найдете установленный каталог OpenSSL?
Ваша система может отличаться от моей, но, как вы видите, у меня установлено много разных библиотек openssl. На момент написания этой статьи python 3.8 ожидает openssl 1.0.2 или 1.1:
Python требует наличия библиотеки libssl, совместимой с OpenSSL 1.0.2 или 1.1 с X509_VERIFY_PARAM_set1_host ().
Поэтому вам нужно будет проверить, какие из этих установленных библиотек вы можете использовать для компоновки, например
Возможно, вам придется попробовать несколько или установить новую, чтобы найти библиотеку, которая подойдет для вашего Python и вашей ОС.