无法在具有 OpenSSL 1.0.2g 和 Python 2.7 的 Docker Alpine Linux 3.3 中“pip install cryptography”

Posted

技术标签:

【中文标题】无法在具有 OpenSSL 1.0.2g 和 Python 2.7 的 Docker Alpine Linux 3.3 中“pip install cryptography”【英文标题】:Cannot "pip install cryptography" in Docker Alpine Linux 3.3 with OpenSSL 1.0.2g and Python 2.7 【发布时间】:2016-06-14 16:17:38 【问题描述】:

已解决哇,这些家伙速度很快...基本上就是这个https://github.com/pyca/cryptography/issues/2750 原来是发布了针对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 年 3 月 1 日(昨天)发布,alpine 软件包已经更新到该版本。会不会和这个有关?

我该如何解决这个问题?也许我可以设置一些环境变量?

更新我一直在检查 GitHub 存储库中的 openssl,事实上,在 1.0.2f 到 1.0.2g 的过渡期间,openssl/bio.h 中的 BIO *BIO_new_mem_buf(void *buf, int len) 已更改为 BIO *BIO_new_mem_buf(const void *buf, int len)(搜索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 repo 中的那个。有什么想法吗?

好的,我看到有些人已经在做这个了: https://github.com/pyca/cryptography/issues/2750

【问题讨论】:

我今天在安装密码学 1.2.2 时遇到了同样的问题,升级到 1.2.3 解决了它。 【参考方案1】:

对于那些在 Alpine 3.7 中安装 cryptography==2.1.4 时仍然遇到问题的用户,如下所示:

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

参考

cryptography 在 Alpine 上的安装说明可以在这里找到:

https://cryptography.io/en/latest/installation/#building-cryptography-on-linux 撰写本文时的版本is available on github

以下是相关部分:

在 Linux 上构建密码学

[跳过非 Alpine Linux 的部分] ...

$ pip install cryptography

如果你在 Alpine 上或者只是想自己编译它 cryptography 需要一个编译器,Python 的头文件(如果你不是 使用 pypy),以及 OpenSSL 和 libffi 库的标头 在您的系统上可用。

阿尔卑斯山

如果您使用的是 Python 2,请将 python3-dev 替换为 python-dev

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

如果openssl-dev 出现错误,您可能必须使用libressl-dev

【讨论】:

感谢您的回答。请详细说明答案中的代码,以防链接失效。 请详细说明您的答案 当时cryptography 模块的开发人员解决了这个问题,该模块与OpenSSL 库不同步。您在这里提到的方法将OpenSSL 替换为LibreSSL。它提供了一种解决方法,而不是解决方案。真的需要像tini 这样的所有这些库吗?感谢您提供另一种方法(我假设它有效,但不会尝试)。 在重新排列代码以进行正确格式化时,我注意到您实际上并未安装模块 cryptography @DanielF 顺便说一句,我在示例中包含了 tini 和其他库,而不是在实际解决方案中。如果它太偏离,我将其删除....【参考方案2】:

如果由于 Rust 版本而失败,那么在密码学的文档中推荐以下内容:

The Rust available by default in Alpine < 3.12 is older than the 
minimum supported version. See the Rust installation instructions
 for information about installing a newer Rust.
$ sudo apk add gcc musl-dev python3-dev libffi-dev openssl-dev cargo

在我的例子中,python3.8-alpine,添加 cargo 已解决。

【讨论】:

"cargo" 安装“Rust”(已测试)。奇怪的是,安装 Poetry 并且在 Poetry 尝试安装“cryptography”时至少出现了类似的错误,Poetry 的错误也与安装的“cargo”保持一致,仍然说它需要“Rust”。我必须自己安装“密码学”才能完成安装,就像接受的答案一样。有一个较旧的 Python 版本,我还必须添加一个选定的版本,请参阅Failed to install cryptography package with Poetry on Python 3.9。之后,我可以安装 Poetry。【参考方案3】:

安装前添加:

RUN apk -U upgrade

RUN apk add --no-cache libffi-dev openssl-dev

【讨论】:

【参考方案4】:

或者使用构建基础:

RUN apk add --no-cache --upgrade --virtual .build-deps build-base

详情请看:https://git.alpinelinux.org/aports/tree/main/build-base/APKBUILD?h=3.3-stable

【讨论】:

【参考方案5】:

检查您是否正在为正确的架构进行构建!

x86-64 或 amd64 架构运行类似的软件,另一类是 aarch64 或 arm 架构芯片,如 Apple Silicon M1 或您的手机 cpu

【讨论】:

这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review

以上是关于无法在具有 OpenSSL 1.0.2g 和 Python 2.7 的 Docker Alpine Linux 3.3 中“pip install cryptography”的主要内容,如果未能解决你的问题,请参考以下文章

OpenSSL -aes-256-cbc解密行为在1.0.2o和1.1.0g之间变化

如何升级OpenSSl版本

不同openssl版本的行为差异

Ruby 2.6.6 OpenSSL 1.1.1g - 证书验证失败(无法获取本地颁发者证书)

CentOS6.5的openssl升级

openssl windows 下 编译 bat