Certbot: 导入错误:“pyOpenSSL”模块缺少所需的功能

创建于 2017-04-17  ·  35评论  ·  资料来源: certbot/certbot

我的操作系统是(包括版本):

CentOS Linux 版本 7.3.1611

我使用(certbot-auto、OS 包管理器、pip 等)安装了 Certbot:

操作系统打包管理器

我运行了这个命令,它产生了这个输出:

certbot更新

回溯(最近一次调用最后一次):
文件“/bin/certbot”,第 7 行,在
从 certbot.main 导入主
文件“/usr/lib/python2.7/site-packages/certbot/main.py”,第 17 行,在
从 certbot 导入客户端
文件“/usr/lib/python2.7/site-packages/certbot/client.py”,第 10 行,在
从 acme 导入客户端为 acme_client
文件“/usr/lib/python2.7/site-packages/acme/client.py”,第 31 行,在
requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3() # 类型:忽略
文件“/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py”,第112行,inject_into_urllib3
_validate_dependencies_met()
文件“/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py”,第 147 行,在 _validate_dependencies_met
raise ImportError("'pyOpenSSL' 模块缺少所需的功能。"
导入错误:“pyOpenSSL”模块缺少所需的功能。 尝试升级到 v0.14 或更新版本。

Certbot 的行为与我预期的不同,因为:

它应该成功更新而不是错误。

这是显示问题的 Certbot 日志(如果可用):

默认情况下,日志存储在/var/log/letsencrypt 。 随意编辑您认为合适的域、电子邮件和 IP 地址。

没有日志条目。 我已经删除了 pyopenssl 并重新安装了它。

pip 显示 pyOpenssl

名称:pyOpenSSL
版本:16.2.0
总结:围绕 OpenSSL 库的 Python 包装器模块
主页: https :
添加一名作者
作者邮箱: [email protected]
许可证:Apache 许可证,版本 2.0
位置:/usr/lib64/python2.7/site-packages
要求:六、密码学

但错误仍然存​​在。 任何的想法 ?

pkging

最有用的评论

伙计们,不要通过pip混合yum已安装的软件包。 正确的修复包括删除 pip 包并安装yum 。 我在这里概述了它。

您不需要在 CentOS 7 上使用更新的 pyOpenSSL 来运行 certbot! 并不是说依赖第三个包最终不会给你带来任何好处:)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

所有35条评论

也许有多个 pyOpenSSL 版本,所以 urllib3 会被混淆。 在/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py中,应该有这样的几行:

    # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509
    # attribute is only present on those versions.
    from OpenSSL.crypto import X509
    x509 = X509()
    if getattr(x509, "_x509", None) is None:
        raise ImportError("'pyOpenSSL' module missing required functionality. "
                          "Try upgrading to v0.14 or newer.")

你能添加一些调试代码看看输出是什么吗?

    # pyOpenSSL 0.14 and above use cryptography for OpenSSL bindings. The _x509
    # attribute is only present on those versions.
    import OpenSSL.crypto
    print(OpenSSL.crypto)
    from OpenSSL.crypto import X509
    x509 = X509()
    if getattr(x509, "_x509", None) is None:
        raise ImportError("'pyOpenSSL' module missing required functionality. "
                          "Try upgrading to v0.14 or newer.")

请注意 Python 不喜欢制表符。 始终插入空格以进行标识。 此外,您需要 root 来修改此文件。

这是输出:

certbot更新



回溯(最近一次调用最后一次):
文件“/bin/certbot”,第 7 行,在
从 certbot.main 导入主
文件“/usr/lib/python2.7/site-packages/certbot/main.py”,第 17 行,在
从 certbot 导入客户端
文件“/usr/lib/python2.7/site-packages/certbot/client.py”,第 10 行,在
从 acme 导入客户端为 acme_client
文件“/usr/lib/python2.7/site-packages/acme/client.py”,第 31 行,在
requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3() # 类型:忽略
文件“/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py”,第112行,inject_into_urllib3
_validate_dependencies_met()
文件“/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py”,第 149 行,在 _validate_dependencies_met
raise ImportError("'pyOpenSSL' 模块缺少所需的功能。"
导入错误:“pyOpenSSL”模块缺少所需的功能。 尝试升级到 v0.14 或更新版本。

/usr/lib64/python2.7/site-packages/OpenSSL/crypto.so

此路径类似于早期的 pyOpenSSL 包。 您可以通过 yum 删除 pyOpenSSL 并重试吗?

我在centos7上遇到了同样的问题。 删除 pyOpenSSL.x86_64 0:0.13.1-3.el7 没有帮助,因为yum install certbot会重新安装它。

但是我找到了一个解决 RPM 损坏的方法:

yum remove pyOpenSSL.x86_64
cd
mkdir virtualenv
cd virtualenv/
virtualenv --no-site-packages -p /usr/bin/python2.7 certbot
. ~/virtualenv/certbot/bin/activate
pip import six packaging appdirs
pip install setuptools --upgrade                                                                                                                                                                                    pip install certbot
certbot help

新安装的 centos 也有同样的问题。

rpm --query centos-release  # centos-release-7-3.1611.el7.centos.x86_64
wget ftp://ftp.muug.mb.ca/mirror/centos/7.3.1611/cloud/x86_64/openstack-mitaka/common/pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo yum install certbot
certbot renew  # OK

我认为这更像是 CentOS 的问题,而不是 certbot 的问题。 有人可以向 CentOS 报告他们的 pyOpenSSL 太旧了吗?

即使升级到 pyOpenSSL 16.something 后,问题仍然存在于我的系统上

最近在我的 CentOS 7 机器上发生了同样的问题。
唯一的解决方法是pip install pyOpenSSL=0.13.1

最近两个月,它失败了。
而我刚才又试了一次,又失败了。

输出:

>> sudo certbot certonly --standalone -d mydomain.com

<< Traceback (most recent call last):
  File "/bin/certbot", line 9, in <module>
    load_entry_point('certbot==0.12.0', 'console_scripts', 'certbot')()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/usr/lib/python2.7/site-packages/certbot/main.py", line 21, in <module>
    from certbot import client
  File "/usr/lib/python2.7/site-packages/certbot/client.py", line 10, in <module>
    from acme import client as acme_client
  File "/usr/lib/python2.7/site-packages/acme/client.py", line 31, in <module>
    requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3()
  File "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 112, in inject_into_urllib3
    _validate_dependencies_met()
  File "/usr/lib/python2.7/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 147, in _validate_dependencies_met
    raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.

然后我试试这个,它有效:

_20170502100430

答案链接: https :

仅供参考……在 CentOS 上通过 pip 更新 pyOpenSSL 通常是不安全的,因为这样可能会破坏 yum。

您使用的是哪个 certbot 软件包? 如果您可以从 epel-testing 安装 0.13.0,并始终确保您的系统具有完整的 yum 更新,我将不胜感激。

您可能需要使用 yum 重新安装 pyOpenSSL 来修复您的系统(使用 rpm -qV pyOpenSSL 检查它的状态)。

带有该软件包的 systemd 更新计时器存在问题,这就是为什么我没有将其稳定,但仅执行 certbot 请求和手动 certbot 更新即可。

0.14.0 版本也即将发布……我只是在 AWS 中测试了它。

我很好奇 - 原作者通过包管理器安装了它,那么我们将在哪里为 pip 固定一个版本?
人们仍然有这个问题吗? 如果是这样,您使用的是什么安装方法?

您可能想尝试此 Dockerfile 中描述的方法,该方法对我有用:
https://github.com/identinetics/docker-nginx/blob/master/Dockerfile#L65

在全新安装和更新的 centOS 7.3 上仍然存在问题。
通过安装更新​​的 pyOpenSSL rpm 解决了这个问题(pyOpenSSL-0.14-3.fc222 似乎足够了,而 pyOpenSSL-16.2.0-1.fc25 不起作用),但是如何确保它没有破坏其他任何东西?!

https://www.rpmfind.net/linux/rpm2html/search.php?query=pyOpenSSL

谢谢

@tisc0我对您如何安装和运行它以解决该问题的更多细节非常感兴趣。

当我构建 centos7 certbot 软件包时,我在 AWS 中对它们进行了测试,没有任何问题——当然不是你所描述的或这个问题所描述的。

直接在centos7 上安装fedora rpm 是一个糟糕的主意——尤其是像pyOpenSSL 这样的核心包。

嗨,霍加斯,
抱歉缺少细节,这几天有点忙:)
简而言之 :

  • Fedora rpm 的安装没有解决问题(我记得只有 certbot --help 正在工作)
  • 在玩了很长时间的包之后,并检查它实际上在另一个新的 centos 7 中工作(没有开箱即用的包),我重新安装了它们并最终得到了关于 urllib3 的另一个错误(也要求安装更新版本,这我没有买;])。
  • 我决定使用 yum(而不是使用 rpm -e)和所有依赖包删除/重新安装 urllib3; 在这种情况下,ipa-client 也需要一些常用的包...
  • 我重新安装了(按那个顺序)urllib3 和 certbot:它起作用了
  • 我终于重新安装了 ipa-client,它现在可以工作了。

[ root@c7-dse ~]# echo N | yum 删除 python-urllib3 | awk '{print $1}'
(……)
依赖关系

==============
包裹
删除:
蟒蛇-urllib3
删除
证书机器人
ipa客户端
蟒蛇请求
python2-acme
python2-certbot
python2-ipaclient
python2-ipalib

欢迎任何解释为什么重新安装某些软件包使其工作的想法:)

@tisc0感谢您提供更多详细信息

强制安装/删除软件包通常会导致问题 - 系统库的 pip 升级也是如此。

只获取 Fedora 软件包用于 CentOS 而不从 src.rpm 进行软件包本身的重建很少是一个好主意

通过重新安装软件包(而不是删除和安装具有依赖性问题的 yum 重新安装可以是一个救星),原始文件被验证到位。

我很高兴听到重新安装 CentOS 软件包对您有用:)

由于@tisc0现在似乎有一个工作设置,我将关闭这个问题。 如果有人仍然遇到问题,请提交一个新问题,因为该线程变得非常拥挤。

对于 CentOS7,只需执行“mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL”,这对我来说就像一个魅力!!!

肮脏的黑客:1st_place_medal: ;)

刚刚遇到了同样的问题,那是因为pip install -U确实覆盖了从 RPM 安装的 python 模块。

为了解决这个问题,我做了以下事情:

问题

  File "/usr/lib/python2.7/site-packages/urllib3/contrib/pyopenssl.py", line 147, in _validate_dependencies_met
    raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.

解决方案

[root<strong i="12">@kolla</strong> ~]# rpm -qf /usr/lib64/python2.7/site-packages/OpenSSL/
pyOpenSSL-0.13.1-3.el7.x86_64
[root<strong i="13">@kolla</strong> ~]# rpm -qf /usr/lib/python2.7/site-packages/urllib3
python-urllib3-1.10.2-2.el7_1.noarch

[root<strong i="14">@kolla</strong> ~]# rpm --nodeps -e python-urllib3
[root<strong i="15">@kolla</strong> ~]# rm -rf /usr/lib/python2.7/site-packages/urllib3/
[root<strong i="16">@kolla</strong> ~]# yum -y install python-urllib3

问题

  File "/usr/lib/python2.7/site-packages/requests/__init__.py", line 90, in <module>
    from urllib3.exceptions import DependencyWarning
ImportError: cannot import name DependencyWarning
[root<strong i="20">@kolla</strong> ~]# rpm -qf /usr/lib/python2.7/site-packages/requests
python-requests-2.6.0-1.el7_1.noarch

解决方案

[root<strong i="24">@kolla</strong> ~]# rpm --nodeps -e python-requests
[root<strong i="25">@kolla</strong> ~]# rm -rf /usr/lib/python2.7/site-packages/requests
[root<strong i="26">@kolla</strong> ~]# yum -y install python-requests   

2018 年 1 月 29 日更新:

再次遇到同样的问题,这次使用docker容器要容易得多:)

alias certbot='docker run --rm -ti -v /etc/letsencrypt:/etc/letsencrypt -p 80:80 certbot/certbot:v0.21.1'

@cnritng它也适用于我

仍然有此问题的任何人,请尝试以下操作:

rpm --query centos-release  # centos-release-7-3.1611.el7.centos.x86_64
wget ftp://ftp.muug.ca/mirror/centos/7/cloud/x86_64/openstack-newton/common/pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo rpm -Uvh pyOpenSSL-0.15.1-1.el7.noarch.rpm
sudo yum install certbot
certbot renew  # OK

来自@sulliwane 。 请注意, ftp://ftp.muug.ca/mirror/...地址已更改。

谢谢@JellyBool

伙计们,不要通过pip混合yum已安装的软件包。 正确的修复包括删除 pip 包并安装yum 。 我在这里概述了它。

您不需要在 CentOS 7 上使用更新的 pyOpenSSL 来运行 certbot! 并不是说依赖第三个包最终不会给你带来任何好处:)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

@dvershinin的上述步骤对我

还可以处理@dvershinin发布的内容。 只需将最后一行从“yum restart python-urllib3”更改为“yum install python-urllib3”

对于 CentOS7,只需执行“mv /usr/lib64/python2.7/site-packages/OpenSSL /usr/lib64/python2.7/site-packages/pyOpenSSL”,这对我来说就像一个魅力!!!

*nix 之类的系统总是有类似的问题:文件依赖被破坏。

伙计们,不要通过pip混合yum已安装的软件包。 正确的修复包括删除 pip 包并安装yum 。 我在这里概述了它。

您不需要在 CentOS 7 上使用更新的 pyOpenSSL 来运行 certbot! 并不是说依赖第三个包最终不会给你带来任何好处:)

pip uninstall requests
yum reinstall python-requests

pip uninstall six
yum reinstall python-six

pip uninstall urllib3
yum reinstall python-urllib3

谢谢! 这是工作!

@dvershinin fix 目前对我不起作用 - 在按照他在 Centos 7 上描述的步骤之后,我收到以下错误:

VersionConflict: (urllib3 1.10.2 (/usr/lib/python2.7/site-packages), Requirement.parse('urllib3>=1.20,<1.26'))

@keir-lavelle 我的修复只是尝试在系统受到严重损坏后通过在root用户下使用pip将系统恢复到原始状态(那里有很多教程让人们这样做,没有考虑到它永远不应该在 CentOS/RHEL 系统中完成的事实!)

因此,如果您对修复它感到冒险,您可以按照我提供的链接尝试通过删除所有Python 包来进一步修复它(请注意, yum也是基于 Python 的),这是一个更危险的企业. (因为你可以打破更多)。

  • 如果您可以从certbot工作的某个快照/备份中恢复您的服务器,那么您应该没问题
  • 否则,“删除所有 Python 包/重新安装”似乎是唯一的修复方法(但请务必考虑这样做的后果,如果由于某种原因,您无法让yum进入工作状态)。

当然,再次记住它会有所帮助:不要在root下使用pippython安装。 这就是它首先破裂的方式。 如果它没有发生 - 它不会破裂。

感谢您花时间解释,我现在只是在测试东西,所以服务器是一次性的,所以如果它坏了也没什么大不了的,但感谢这些信息

此页面是否有帮助?
0 / 5 - 0 等级