web-dev-qa-db-ja.com

OpenSSL 1.0.2gおよびPython 2.7を使用したDocker Alpine Linux 3.3では「pip install cryptography」を実行できません

解決済みうわー、これらの人は速いです...それは基本的にこれです https://github.com/pyca/cryptography/issues/275 opensslのセキュリティアップデートがリリースされ(DROWN Attack)、そのアップデートに予期しない関数シグネチャの変更が含まれているため、非互換性が発生したため、これは私にとっては不運でした。


Alpine Linuxを実行しているDockerコンテナーで_pip install cryptography_を使用する必要があります。実際には、別のモジュール_service_identity_ですが、問題は依存関係であるcryptographyモジュールにあります。

次のDockerfileがあります

_FROM Alpine:3.3

RUN apk --update add build-base libffi-dev openssl-dev python-dev py-pip
RUN pip install cryptography
_

これは次のエラーで失敗します

_generating cffi module 'build/temp.linux-x86_64-2.7/_openssl.c'
building '_openssl' extension
creating build/temp.linux-x86_64-2.7/build
creating build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7
gcc -fno-strict-aliasing -Os -fomit-frame-pointer -DNDEBUG -Os -fomit-frame-pointer -fPIC -I/usr/include/python2.7 -c build/temp.linux-x86_64-2.7/_openssl.c -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/_openssl.o
build/temp.linux-x86_64-2.7/_openssl.c:726:6: error: conflicting types for 'BIO_new_mem_buf'
 BIO *BIO_new_mem_buf(void *, int);
      ^
In file included from /usr/include/openssl/asn1.h:65:0,
                 from build/temp.linux-x86_64-2.7/_openssl.c:434:
/usr/include/openssl/bio.h:692:6: note: previous declaration of 'BIO_new_mem_buf' was here
 BIO *BIO_new_mem_buf(const void *buf, int len);
      ^
error: command 'gcc' failed with exit status 1
_

openssl 1.0.2gは2016-03-01(昨日)にリリースされ、Alpineパッケージはすでにそのバージョンに更新されています。これと関係がありますか?

この問題を解決するにはどうすればよいですか?多分私が設定できるいくつかの環境変数?

UpdateopensslのGitHubリポジトリをチェックしており、実際に_openssl/bio.h_のBIO *BIO_new_mem_buf(void *buf, int len)BIO *BIO_new_mem_buf(const void *buf, int len) 1.0.2fから1.0.2gへの移行中( https://github.com/openssl/openssl/compare/OpenSSL_1_0_2f...OpenSSL_1_0_2g で「BIO_new_mem_buf」を検索)。この_openssl/asn1.h_がどこから来ているのかわかりません。これは、古いバージョンの_openssl/bio.h_をインポートしています。opensslリポジトリにあるものとは異なるためです。何か案は?

さて、私はいくつかがすでにこれに取り組んでいるのを見ています: https://github.com/pyca/cryptography/issues/275

18
Daniel F

次のようにcryptography==2.1.4Alpine 3.7にインストールしても問題が解決しない場合:

writing manifest file 'src/cryptography.Egg-info/SOURCES.txt'
running build_ext
generating cffi module 'build/temp.linux-x86_64-2.7/_padding.c'
creating build/temp.linux-x86_64-2.7
generating cffi module 'build/temp.linux-x86_64-2.7/_constant_time.c'
generating cffi module 'build/temp.linux-x86_64-2.7/_openssl.c'
building '_openssl' extension
creating build/temp.linux-x86_64-2.7/build
creating build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7
gcc -fno-strict-aliasing -Os -fomit-frame-pointer -g -DNDEBUG -Os -fomit-frame-pointer -g -DTHREAD_STACK_SIZE=0x100000 -fPIC -I/usr/include/python2.7 -c build/temp.linux-x86_64-2.7/_openssl.c -o build/temp.linux-x86_64-2.7/build/temp.linux-x86_64-2.7/_openssl.o -Wconversion -Wno-error=sign-conversion
build/temp.linux-x86_64-2.7/_openssl.c:493:30: fatal error: openssl/opensslv.h: No such file or directory
 #include <openssl/opensslv.h>
                              ^
compilation terminated.
error: command 'gcc' failed with exit status 1

解決

これらの依存関係をAlpineコンテナーにインストールします。

$ apk add --no-cache libressl-dev musl-dev libffi-dev

Dockerfileを使用してこれらの依存関係をインストールするには:

RUN apk add --no-cache \
        libressl-dev \
        musl-dev \
        libffi-dev && \
    pip install --no-cache-dir cryptography==2.1.4 && \
    apk del \
        libressl-dev \
        musl-dev \
        libffi-dev

参照

Alpineでのcryptographyのインストール手順は、次の場所にあります。

関連する部分は次のとおりです。

Linuxでの暗号化の構築

[Alpine Linux以外の部分をスキップ]

$ pip install cryptography

アルパインを使用している場合、または自分でコンパイルする場合は、cryptographyにコンパイラー、Pythonのヘッダーが必要です(pypyを使用していない場合)、システムで使用可能なOpenSSLおよびlibffiライブラリのヘッダー。

高山

Python 2.を使用している場合は、python3-devpython-devに置き換えます。

$ Sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev

openssl-devでエラーが発生した場合は、libressl-devを使用する必要があります。

20
Manoj Kasyap