web-dev-qa-db-fra.com

Impossible de "pip installer la cryptographie" dans Docker Alpine Linux 3.3 avec OpenSSL 1.0.2g et Python 2.7

Résolu Wow, ces gars-là sont rapides ... C'est essentiellement ça https://github.com/pyca/cryptography/issues/275 Il s'est avéré qu'une mise à jour de sécurité pour openssl a été publiée (DROWN Attack) et que cette mise à jour contenait un changement de signature de fonction inattendu qui a provoqué l'incompatibilité, donc ce n'était pas de chance pour moi.


Je dois utiliser pip install cryptography Dans un conteneur Docker exécutant Alpine Linux. En fait, c'est un autre module, service_identity, Mais le problème réside dans le module cryptography, qui est une dépendance.

J'ai le Dockerfile suivant

FROM Alpine:3.3

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

qui échoue avec l'erreur suivante

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 a été publié le 01/03/2016 (hier) et le package Alpine a déjà été mis à jour vers cette version. Peut-il être lié à cela?

Comment puis-je résoudre ce problème? Peut-être quelques variables d'environnement que je peux définir?

Mise à jour J'ai vérifié le reps GitHub pour openssl, et en fait BIO *BIO_new_mem_buf(void *buf, int len) de openssl/bio.h A été changé en BIO *BIO_new_mem_buf(const void *buf, int len) pendant la transition 1.0.2f vers 1.0.2g (recherchez "BIO_new_mem_buf" dans https://github.com/openssl/openssl/compare/OpenSSL_1_0_2f...OpenSSL_1_0_2g ). Je ne sais pas d'où vient ce openssl/asn1.h, Qui importe une version obsolète de openssl/bio.h, Car elle ne ressemble pas à celle du dépôt openssl. Des idées?

Ok, je vois que certains y travaillent déjà: https://github.com/pyca/cryptography/issues/275

18
Daniel F

Pour ceux qui rencontrent toujours des problèmes lors de l'installation de cryptography==2.1.4 dans Alpine 3.7 comme ceci:

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

Solution

Installez ces dépendances dans le conteneur Alpine:

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

Pour installer ces dépendances à l'aide d'un 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

Référence

Les instructions d'installation de cryptography sur Alpine peuvent être trouvées ici:

Voici la partie pertinente:

Construire la cryptographie sur Linux

[sauter la partie pour Linux non alpin]

$ pip install cryptography

Si vous êtes sur Alpine ou si vous voulez simplement le compiler vous-même alors cryptography nécessite un compilateur, en-têtes pour Python (si vous n'utilisez pas pypy), et les en-têtes des bibliothèques OpenSSL et libffi disponibles sur votre système.

Alpin

Remplacer python3-dev avec python-dev si vous utilisez Python 2.

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

Si vous obtenez une erreur avec openssl-dev vous devrez peut-être utiliser libressl-dev.

20
Manoj Kasyap