概要
Python3.10以降OpenSSLが1.1以上必須になったため、デフォルトではTLSv1が使えません。
OSのOpenSSLではたぶんSSLv3は無効にされているので使えません。
もちろん使えなくていいのですが、古いSSLv3を使っているサーバーがあるのかどうかをチェックする場合や大人の事情で必要な場合もあるでしょう。
ということで、OpenSSLとPythonを自前でインストールします。
ポイントは
- OpenSSLをSSLv3が使えるようにコンパイルする
- SSLv3、TLS1や脆弱なcipherが使えるように設定する
- Pythonを上でコンパイルしたOpenSSLを使用するようにしてコンパイルする
- CipherをpythonのものではなくOpenSSLのものを使用するようにしてコンパイルする
です。
今回はOpenSSL3.0.8、Python3.11.3の組み合わせで書きましたが、OpenSSL1.1や3.1、Python3.10との組み合わせでも動作します。
必要なライブラリのインストール
debian11の場合。他のOSは適宜変更してください
apt install -y wget make gcc g++ perl libffi-dev xz-utils libz-dev ca-certificates libreadline-dev
OpenSSLのビルド
wget https://www.openssl.org/source/openssl-3.0.8.tar.gz
tar xzf openssl-3.0.8.tar.gz
cd openssl-3.0.8
./config --prefix=/usr/local/openssl --openssldir=/usr/local/ssl enable-ssl3 enable-ssl3-method enable-weak-ssl-ciphers
make
make install
cd /usr/local/openssl
ln -s lib64 lib
mv /usr/local/ssl /usr/local/ssl.org
cp -a /etc/ssl /usr/local/
OpenSSLの設定ファイルの変更
/usr/local/ssl/openssl.cnf
...
[system_default_sect]
# MinProtocol = TLSv1.2 <-- コメントアウト
# CipherString = DEFAULT@SECLEVEL=2 <-- コメントアウト
MinProtocol = None <-- 追加
CipherString = DEFAULT@SECLEVEL=0 <-- 追加
Pythonのビルド
wget https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tgz
tar xvzf Python-3.11.3.tgz
cd Python-3.11.3
./configure --with-openssl=/usr/local/openssl --with-openssl-rpath=auto --enable-optimizations --with-ssl-default-suites=openssl
make altinstall
--with-ssl-default-suites=openssl
を付けてコンパイルするのがポイントです。これがないと、OpenSSLライブラリはTLS1.2未満に対応していても、Pythonの標準の厳しいCipher Suiteを使用してしまいTLS1.2未満が使用できません。
確認
>>> import ssl
>>> ssl.OPENSSL_VERSION
'OpenSSL 3.0.8 7 Feb 2023'
>>> ssl.HAS_TLSv1
True
>>> ssl.HAS_TLSv1_1
True
>>> ssl.HAS_TLSv1_2
True
>>> ssl.HAS_TLSv1_3
True
>>> ssl.HAS_SSLv3
True
いい感じです。