
グーグルで調べた結果、Python はインストールされたバージョンの OpenSSL を使用せず、代わりに独自の ssl モジュールを使用するので、アップグレードするには再構築する必要があると推測するのは正しいと思います。
これは Raspberry Pi 上の、Raspbian Jessie に基づく小さな非 GUI イメージです。時間が許せば、後で現在のディストリビューションに基づいて完全に再構築する予定ですが、今のところは重要なパッケージだけを手動でアップグレードしたいと思っています。
私は git から OpenSSL ソースをクローンし、1.1.1-stable ブランチをチェックアウトしてビルドしました。デフォルトのconfigure
、make
、make test
だけですsudo make install
。
今、このバージョンを使用するために Python を再構築しようとしています。
Python 3 では動作しましたが、Python 2 では動作しません。どちらも、www.python.org/downloads/source/ から本日ダウンロードした tarball で、追加オプションありとなしの./configure
ビルドです。make
3.7.3の結果: makeは成功し、このテストも成功します
$ ./python -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.1.1d-dev xx XXX xxxx
Python の古い (インストールされている) バージョンは、python と python3 の両方で OpenSSL 1.0.1t を報告するため、新しいビルドでは新しいバージョンが使用されます。
2.7.16の結果: makeは部分的にしか成功せず、次のように終了します。
Failed to build these modules:
_hashlib _ssl
そして同じテストが行われます
$ ./python -c "import ssl; print(ssl.OPENSSL_VERSION)"
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/src/python/Python-2.7.16/Lib/ssl.py", line 98, in <module>
import _ssl # if we can't import it, let the error propagate
ImportError: No module named _ssl
これらのモジュールをビルドするときに出力を作成します。
building '_ssl' extension
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -I/usr/include/arm-linux-gnueabihf -I/usr/local/include -I/usr/local/src/python/Python-2.7.16/Include -I/usr/local/src/python/Python-2.7.16 -c /usr/local/src/python/Python-2.7.16/Modules/_ssl.c -o build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_ssl.o
gcc -pthread -shared build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_ssl.o -L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-armv7l-2.7/_ssl.so
*** WARNING: renaming "_ssl" since importing it failed: build/lib.linux-armv7l-2.7/_ssl.so: undefined symbol: OPENSSL_sk_num
building '_hashlib' extension
gcc -pthread -fPIC -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I. -IInclude -I./Include -I/usr/include/arm-linux-gnueabihf -I/usr/local/include -I/usr/local/src/python/Python-2.7.16/Include -I/usr/local/src/python/Python-2.7.16 -c /usr/local/src/python/Python-2.7.16/Modules/_hashopenssl.c -o build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_hashopenssl.o
gcc -pthread -shared build/temp.linux-armv7l-2.7/usr/local/src/python/Python-2.7.16/Modules/_hashopenssl.o -L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib -lssl -lcrypto -o build/lib.linux-armv7l-2.7/_hashlib.so
*** WARNING: renaming "_hashlib" since importing it failed: build/lib.linux-armv7l-2.7/_hashlib.so: undefined symbol: OPENSSL_init_crypto
答え1
質問に対する私のコメントにあるように、答えは「はい」です。
[編集: 最初は CFLAGS が原因だと思いましたが、違いました。]
ようやくできました。_ssl モジュールのビルド コマンドには、次のスイッチが含まれています。
-L/usr/lib/arm-linux-gnueabihf -L/usr/local/lib
これら 2 つの場所のうち最初の場所には、libssl.so の古いバージョン (1.0.0) がまだ含まれていました。正しいバージョンは 2 番目のパスにありました。
面白いことに、3.7.3 をビルドするときには違いがなく、2.7.16 の場合にのみ違いがあったようです。