さくらのレンタルサーバでHTTPS (TLS) 対応のPython 2.7をビルドした記録

# はじめに

さくらのレンタルサーバにはデフォルトでPython 2.7が入っています（スタンダードプラン、2018年12月現在）が、TLSに対応していません。
そのため、今日のほとんどのHTTPSサイトにアクセスできず、pipなども使えません。つらい。

```terminal:terminal
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ python get-pip.py
Collecting pip
/tmp/tmpQzUTJP/pip.zip/pip/_vendor/urllib3/util/ssl_.py:369: SNIMissingWarning: An HTTPS request has been made, but the SNI (Server Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
/tmp/tmpQzUTJP/pip.zip/pip/_vendor/urllib3/util/ssl_.py:160: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError(SSLError(1, '_ssl.c:507: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version'),)': /simple/pip/
```

リンクしているOpenSSLのバージョンが古いようです。

```terminal:terminal
$ python -c 'import ssl; print ssl.OPENSSL_VERSION'
OpenSSL 0.9.8zf 19 Mar 2015
```

というわけで、新しいOpenSSLを取ってきて、Pythonを自分でビルドしてみたいと思います。

なお、このサーバはFreeBSDなので、Linuxとはちょっとコマンドが違う部分があります。
例えば、Linuxでいうところの``make``（GNU make）は ``gmake`` です。

# 必要なもの

- Python 2.7のソースコード
- OpenSSLのソースコード

## OpenSSL

※[さくらのレンタルサーバでHTTPS (TLS) 対応のGitをビルドした記録](https://qiita.com/everylittle/items/88f3e9123b5c8f06389c)で紹介している手順と同じです。

```terminal:terminal
$ openssl version
OpenSSL 1.0.2o  27 Mar 2018
```

などと出るのですが、ライブラリやヘッダファイルは「0.9.8」であるらしく、このままだとうまくいきません。
よって、まずはOpenSSLを自前で入れます。

```terminal:terminal
# 作業場所は適当に
$ mkdir -p ~/.local/src
$ cd ~/.local/src
$ wget https://www.openssl.org/source/openssl-1.0.2q.tar.gz
$ tar xvfz openssl-1.0.2q.tar.gz
$ cd openssl-1.0.2q
$ ./config --prefix=${HOME}/.local -fPIC
$ gmake
$ gmake install
```

バージョンを確認。

```terminal:terminal
$ ~/.local/bin/openssl version
OpenSSL 1.0.2q  20 Nov 2018
```

第一段階突破。

## Python 2.7

```terminal:terminal
$ cd ~/.local/src
$ wget https://www.python.org/ftp/python/2.7.15/Python-2.7.15.tgz
$ tar xvfz Python-2.7.15.tgz
$ cd Python-2.7.15
$ env CXX=/usr/bin/g++ ./configure --prefix=${HOME}/.local --enable-unicode=ucs4
$ gmake
$ gmake install
```

これで新しいOpenSSLを使ってくれるはず。

```terminal:terminal
$ ~/.local/bin/python -c 'import ssl; print ssl.OPENSSL_VERSION'
OpenSSL 1.0.2q  20 Nov 2018
```

キター。
そして ``get-pip.py`` も動きます。

```terminal:terminal
$ ~/.local/bin/python get-pip.py
Collecting pip
  Downloading https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl (1.3MB)
Collecting setuptools
  Downloading https://files.pythonhosted.org/packages/37/06/754589caf971b0d2d48f151c2586f62902d93dc908e2fd9b9b9f6aa3c9dd/setuptools-40.6.3-py2.py3-none-any.whl (573kB)
Collecting wheel
  Downloading https://files.pythonhosted.org/packages/ff/47/1dfa4795e24fd6f93d5d58602dd716c3f101cfd5a77cd9acbe519b44a0a9/wheel-0.32.3-py2.py3-none-any.whl
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-18.1 setuptools-40.6.3 wheel-0.32.3
```

あとは好きにパッケージを追加できます。

```terminal:terminal
$ ~/.local/bin/pip install numpy
```

めでたしめでたし。