Собираем Python 3.5 с новым OpenSSL на Ubuntu 12.04

Установка Python 3.5 дело не сложное, да вот установится он на Ubuntu 12.04 скомпилированный на OpenSSL 1.0.1, а для поддержки современных протоколов TLS необходима версия не ниже 1.0.2+.

Проблема: При подключении из Python 3.5 используя TLS, получаем ошибку:
SSLError: [SSL: TLSV1_UNRECOGNIZED_NAME] unknown error (_ssl.c:###)

Исходные данные:

  • Ubuntu Server 12.04
  • OpenSSL 1.0.1

Что получим:

  • OpenSSL 1.0.2+
  • Python 3.5.2 с поддержкой современных протоколов
  • Nginx c полноценной поддержкой HTTP/2 (бонусом)

Одна из программ, которые нам понадобятся — checkinstall. Она предназначена для создания бинарного пакета из исходных файлов, что позволит устанавливать и удалять готовый пакет. Дополнительным преимуществом является возможность использования данного пакета на схожих машинах. Подробнее здесь.

Установим ее:

sudo apt-get install checkinstall

Актуальный OpenSSL возьмем из ppa-репозитория с Nginx. Устаналиваем необходимые пакеты для комфортного подключения репозитория, подключаем репозиторий и устанавливаем нужные пакеты openssl и libssl-dev.

sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:ondrej/nginx
sudo apt-get update
sudo apt-get install openssl libssl-dev

Также можно и Nginx правильный установить с полноценной поддержкой HTTP/2, о чем подробнее здесь.

Проверим версию OpenSSL командой openssl version. Если видим версию выше 1.0.2, тогда успех на нашей стороне.

Теперь скачаем исходники Python и распакуем их.

wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgz
tar -xzf Python-3.5.2.tgz

Теперь готовим исходники и создаем бинарный пакет, заполнив необходимые данные. Созданный пакет будет сразу установлен в систему и его можно будет использовать. Примеры заполнения полей checkinstall:

  • Название (name): python3.5
  • Provides: python3.5
  • Версия (version): 3.5.2-20161029
cd Python-3.5.2
./configure
make
sudo checkinstall

Установить и удалить готовый пакет можно командами:

dpkg -i python3.5_3.5.2-20161029-1_amd64.deb
apt-get remove python3.5

Проверка версии OpenSSL внутри Python:

python3.5 -c "import ssl; print(ssl.OPENSSL_VERSION)"

Если видим версию 1.0.2+, значит фортуна нам благоволит. Дополнительно будет установлен pip3.5, который можно использовать для установки virtualenv и дальнешего создания окружений.

Напишите в комментариях, стоит ли вообще пялиться с Ubuntu 12?