Python 2.7.16 は openssl 1.1.1 でビルドできますか?

Python 2.7.16 は openssl 1.1.1 でビルドできますか?

グーグルで調べた結果、Python はインストールされたバージョンの OpenSSL を使用せず、代わりに独自の ssl モジュールを使用するので、アップグレードするには再構築する必要があると推測するのは正しいと思います。

これは Raspberry Pi 上の、Raspbian Jessie に基づく小さな非 GUI イメージです。時間が許せば、後で現在のディストリビューションに基づいて完全に再構築する予定ですが、今のところは重要なパッケージだけを手動でアップグレードしたいと思っています。

私は git から OpenSSL ソースをクローンし、1.1.1-stable ブランチをチェックアウトしてビルドしました。デフォルトのconfiguremakemake 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 の場合にのみ違いがあったようです。

関連情報