【问题标题】:undefined symbol: OPENSSL_sk_num未定义符号:OPENSSL_sk_num
【发布时间】:2017-06-25 22:58:38
【问题描述】:

我正在尝试使用Certbot 续订Let's Encrypt 证书。它停止工作,我不知道为什么。这是错误:

ImportError: /root/.local/share/letsencrypt/local/lib/python2.7/site-packages/cryptography/
hazmat/bindings/_openssl.so: undefined symbol: OPENSSL_sk_num

我安装了最新的 OpenSSL 版本

OpenSSL 1.1.0d  26 Jan 2017

我尝试通过执行以下操作来调试此问题。首先,我只是尝试在 python 控制台中添加 import OpenSSL。它工作得很好,没有错误。但是当我尝试时

. ~/.local/share/letsencrypt/bin/activate

然后>>> import OpenSSl 我得到错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/OpenSSL/rand.py", line 12, in <module>
    from OpenSSL._util import (
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/OpenSSL/_util.py", line 6, in <module>
    from cryptography.hazmat.bindings.openssl.binding import Binding
  File "/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/cryptography/hazmat/bindings/openssl/binding.py", line 14, in <module>
    from cryptography.hazmat.bindings._openssl import ffi, lib
ImportError: /root/.local/share/letsencrypt/local/lib/python2.7/site-packages/cryptography/hazmat/bindings/_openssl.so: undefined symbol: OPENSSL_sk_num

我尝试删除 /root/.local/share/letsencrypt/ 路径,然后尝试再次运行 certbot-auto。我仍然得到同样的错误。有没有人遇到过这个问题并知道解决方案?请帮帮我。需要更新一些证书。

更新:

我发现问题源是在/lib/x86_64-linux-gnu 目录中有旧版本的libssl.so.1.0.0 并且它没有OPENSSL_sk_num。当我尝试用较新版本的 libssl1.1(它确实有 OPENSSL_sk_num)替换时,我收到一个错误,它需要 OPENSSL_VERSION 1.0.1。然后在从 /usr 目录和本地目录中删除库后,我得到了错误ImportError: libssl.so.1.0.0: cannot open shared object file: No such file or directory。我该如何更改它,以便让我们使用更新的库?

解决方案

经过一番挣扎。我刚刚重新安装了 openssl 1.1.0c 版。从另一个项目复制了letsencrypt库并且它有效。我认为一些升级毁了它。所以我建议大家在运行 letencrypt 时只使用 --no-self-upgrade 选项。

解决方案更新

再次遇到此问题后,我决定以正确的方式解决它。所以基本上你需要用命令重新编译openssl 1.1.0c:

./config -Wl,--enable-new-dtags,-rpath,'$(LIBRPATH)'make

将编译好的libcrypto.so.1.1libssl.so.1.1复制到/usr/lib/x86_64-linux-gnu

然后您需要重做或仅修改 libcryptolibssl 符号链接。 在/usr/lib/x86_64-linux-gnu 文件夹中输入命令ln -s libssl.so.1.1 libsslln -s libcrypto.so.1.1 libcrypto

然后输入以下命令:

cd ~/.local/share/letsencrypt/bin/
./pip uninstall cryptography pyopenssl -y
./pip install --upgrade pip
rm -rf ~/.cache/
./pip install cryptography pyopenssl

你已经完成了,一切都应该正常工作。

【问题讨论】:

  • 只是一个猜测,但回到 OpenSSL 1.0.2 行。很多符号在 1.1.0 中发生了变化,一些可见性也发生了变化。 OpenSSL 1.0.2 和 OpenSSL 1.1.0 是二进制兼容的。
  • 我不知道如何从分发中完全删除新版本。因为我已经删除了使用 whereis openssl 命令找到的所有内容。然后运行命令 apt-get remove openssl。然后用 apt-get install openssl 安装。现在我的版本是 OpenSSL 1.0.1f 2014 年 1 月 6 日仍然无法续订。有什么想法吗?
  • @ŽygimantasBaranauskas 还是一样的错误吗?
  • @glibdud 是的,错误还是一样。没有任何改变。
  • 在 certbot 的 github 上好像有一个 related issue

标签: python-2.7 pyopenssl certbot


【解决方案1】:

看起来在 openssl 的 1.1.0f 版本中,符号 OPENSSL_sk_num 已移动到 libcrypto.a。 python 3 的构建似乎没有将其链接,因此缺少符号。然而,我错了。当Modules/Setup.dist文件修改为自己的openssl版本时,需要复制到Modules/Setup,否则会使用已经安装好的ssl。

【讨论】:

    【解决方案2】:

    我自己编译 openssl 后也遇到了undefined symbol: OPENSSL_sk_num 错误。 我可以通过删除 ~/.local/share 中的 openssl 目录来解决这个问题,该目录创建得更错误并重新开始。它必须是一些缓存和/或错误的库路径问题。

    【讨论】:

      【解决方案3】:

      我在 Centos 7 上安装 Python3.6.2 时遇到了这个错误,它已经安装了 openssl 1.0.1e,我下载了 openssl 1.1.0.e。在接下来的步骤之后它可以正常工作。

      cd ${openssl_src_path}
      

      在我的例子中 ${openssl_src_path} 是 '/usr/local/server/openssl-1.1.0e'

      ./configure --prefix=/usr/local --openssldir=/usr/local/openssl
      
      make
      make test
      make install
      

      OpenSSL安装正确后,安装Python3.6.2

      cd ${python_src_path}/Modules
      

      修改“设置”文件,更改日志:

          SSL=/usr/local/openssl
      _ssl _ssl.c \
          -DUSE_SSL -I/usr/local/openssl/include -I/usr/local/openssl/include/openssl \
          -L/usr/local/openssl/lib -lssl -lcryptoere
      

      'SSL=/usr/local/openssl' 是安装 OpenSSL 参数 '--openssldir' 的值。并确保 DUSE_SSL 目录存在。

      cd ${python_src_path}
      ./configure
      make
      make install
      

      希望有帮助。

      【讨论】:

        猜你喜欢
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 2012-11-07
        • 2012-09-05
        • 2018-06-19
        • 2021-03-31
        • 2016-06-23
        相关资源
        最近更新 更多