LoginSignup
3
0

More than 5 years have passed since last update.

(CentOS5)pyenv で TLS(SSL) 最新バージョンに変更した Python 3 を使う

Last updated at Posted at 2018-07-03

CentOS5 はもう使っちゃダメですよ

  • 新しい OS に移行を急ぎましょう。
  • rpm ではもはやカバーできないので、 /usr/local を使って 完全にやっつけ仕事です

OpenSSL 最新版のライブラリをコンパイル

https://www.openssl.org/source/ から、 openssl-1.0.2o.tar.gz を他の環境でダウンロード(1.0.2o は現時点での Long Term Support (LTS) release の 1.0.2 シリーズの最新版です)してホームディレクトリに置いておきます。他の環境、というのは CentOS5 の OpenSSL は古いのでた例えば CentOS5 上の curl を使うと https の TLS のバージョンについていけず接続できないためです。

$ sudo su
# cd /usr/local/src
# tar xvfz ~/openssl-1.0.2o.tar.gz
# cd openssl-1.0.2o
# CFLAGS=-fPIC ./config shared
# make install

参考: Compile OpenSSL with the 'shared' option?

Curl を、インストールした OpenSSL ライブラリを使って作り直し

pyenv は、各バージョンの Python を curl を使ってダウンロードしますが、CentOS の curl は OpenSSL が古いため TLS のバージョンについていけず https プロトコルを使ってダウンロードできません。そこで上でインストールした OpenSSL を使用した curl を /usr/local 以下にインストールします。これで TLS のバージョンに追従できるようになります。
https://github.com/curl/curl/releases から、 curl-7.60.0.tar.gz を他の環境からダウンロード(7.60.0 は現時点での最新版です)してホームディレクトリに置いておきます。他の環境、というのは CentOS5 の OpenSSL は古いので例えば CentOS5 上の curl を使うと https の TLS のバージョンについていけず接続できないためです。

$ sudo su
# cd /usr/local/src
# tar xvfz ~/curl-7.60.0.tar.gz
# cd curl-7.60.0
# PKG_CONFIG_PATH=/usr/local/ssl/lib/pkgconfig ./configure --prefix=/usr/local --enable-libcurl-option
# make
# make install

参考: error compiling curl with my own openssl version

/usr/local/bin にパスが通っていないので、次のファイルを置きます。

/etc/profile.d/usrlocal.sh
pathmunge /usr/local/bin

/etc/profile.d/usrlocal.sh を置いたら、いったん /usr/local/bin のパスを反映するためログアウトしてログインします。ログインしたら、 OpenSSL/1.0.2o が curl で使われることを確認します。

$ curl -V
curl 7.60.0 (x86_64-pc-linux-gnu) libcurl/7.60.0 OpenSSL/1.0.2o zlib/1.2.3
Release-Date: 2018-05-16
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets HTTPS-proxy

ldconfig で /usr/local/ 以下のライブラリを認識させます

/etc/ld.so.conf.d/openssl.conf
/usr/local/ssl/lib/
# ldconfig

pyenv 最新版をダウンロードして配置

https://github.com/pyenv/pyenv より pyenv-master.zip をダウンロードしてホームディレクトリにおいておきます。先ほどインストールした curl は TLS に追随するためダウンロード可能です。git コマンドを使いたいところですが、CentOS5 の git も https の TLS のバージョンについていけず github に接続できません。先ほどコンパイルした curl のライブラリを使えば git もコンパイルはできるのですが、ダウンロードせず終了する謎の挙動がでてそれ以上深追いしていません。
ダウンロード後ディレクトリ名を変えて、

$ unzip pyenv-master.zip
$ mv pyenv-master .pyenv 

~/.bash_profile追加します

~/.bash_profile(追加)
# User specific environment and startup programs
export PYENV_ROOT="$HOME/.pyenv"
PATH=$PATH:$HOME/bin
PATH="$PYENV_ROOT/bin:$PATH"
export PATH
if command -v pyenv 1>/dev/null 2>&1; then
  eval "$(pyenv init -)"
fi
# 必要なら pip などで使う proxy 追加
export http_proxy=http://10.1.1.1:3128/
export https_proxy=http://10.1.1.1:3128/

ここでログアウトしてログインし、環境変数を再構築します。

お好みの Python をインストール

openssl-1.0.2o を使用して Python をコンパイルするため pyenv install する前に環境変数を付加します。

$ export CFLAGS="-I/usr/local/ssl/include"
$ export LDFLAGS="-L/usr/local/ssl/lib/"
$ pyenv install 3.6.5
$ pyenv global 3.6.5
$ pyenv versions
  system
* 3.6.5 (set by /home/yamachan/.python-version)
$ python -V
Python 3.6.5

/usr/local の OpenSSL がリンクされていることを確認

  • OpenSSL 1.0.2o とでているので /usr/local の OpenSSL を読んでることが確認できました
$ python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2o  27 Mar 2018 
3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0