未定义的符号:OPENSSL_sk_num

Žyg*_*kas 5 pyopenssl python-2.7 certbot

我正在尝试使用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
Run Code Online (Sandbox Code Playgroud)

我安装了最新的OpenSSL版本

OpenSSL 1.1.0d  26 Jan 2017
Run Code Online (Sandbox Code Playgroud)

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

. ~/.local/share/letsencrypt/bin/activate
Run Code Online (Sandbox Code Playgroud)

然后>>> 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
Run Code Online (Sandbox Code Playgroud)

我尝试删除/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.我怎样才能改变它让letsencrypt使用更新的库?

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

解决方案更新

在遇到这个问题后,我又决定以正确的方式解决它.所以基本上你需要用命令重新编译openssl 1.1.0c:

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

将编译的程序libcrypto.so.1.1,并libssl.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
Run Code Online (Sandbox Code Playgroud)

你完成了,一切都应该正常工作.

小智 0

undefined symbol: OPENSSL_sk_num自己编译openssl后也出现这个错误。我可以通过删除之前创建的 openssl 目录~/.local/share并重新开始来解决该问题。这一定是一些缓存和/或错误的库路径问题。