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

# 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 のバージョンについていけず接続できないためです。

```shell-session
$ 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?](https://stackoverflow.com/questions/2537271/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 のバージョンについていけず接続できないためです。

```shell-session
$ 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](https://github.com/curl/curl/issues/1420)

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

```shell:/etc/profile.d/usrlocal.sh
pathmunge /usr/local/bin
```

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

```shell-session
$ 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/ 以下のライブラリを認識させます

```shell:/etc/ld.so.conf.d/openssl.conf
/usr/local/ssl/lib/
```

```shell-session
# ldconfig
```

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

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

```shell-session
$ unzip pyenv-master.zip
$ mv pyenv-master .pyenv 
```

`~/.bash_profile` に **追加します**。

```shell:~/.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 する前に環境変数を付加します。

```shell-session
$ 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 を読んでることが確認できました

```shell-session
$ python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.0.2o  27 Mar 2018 
```