2017-02-08 146 views
4

我正在尝试使用Certbot更新Let's Encrypt证书。它停止工作,我不知道为什么。以下是错误:未定义符号:OPENSSL_sk_num

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控制台中添加导入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-汽车。我仍然有同样的错误。有没有人遇到这个问题并且知道解决方案?请帮我在这里。需要更新少量证书。

UPDATE:

心中已经找到了问题的根源,在/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使用更新的库?

SOLUTION

一番搏斗之后。我刚刚重新安装了openssl 1.1.0c版本。从另一个项目复制letsencrypt库,它工作。我认为一些升级毁了它。所以我建议大家在运行letsencrypt时只使用--no-self-upgrade选项。

解决方案Update

遇到了这个问题后,一个更多的时间,我决定解决这个问题的正确方法。所以基本上你需要重新编译的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 

而且站立着进行,一切都应该正常工作。

+0

只是一个猜测,但回落到OpenSSL 1.0.2行。很多符号在1.1.0中进行了更改,并且一些可见性也发生了变化。 OpenSSL 1.0.2和OpenSSL 1.1.0 *不是二进制兼容的。 – jww

+0

我不知道如何从发行版中完全删除新版本。因为我删除了我用whereis openssl找到的所有东西。然后运行命令apt-get remove openssl。然后,只需安装apt-get install openssl。现在我的版本是OpenSSL 1.0.1f 2014年1月6日还不能续订。有任何想法吗? –

+0

@ŽygimantasBaranauskas它仍然是一样的错误? – glibdud

回答

0

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

+0

也试过。当时没有帮助我。 –

0

我在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' is value of install OpenSSL parameter '--openssldir' .and make sure DUSE_SSL directory exist.

cd ${python_src_path} 
./configure 
make 
make install 

希望对您有所帮助。

0

它看起来像openssl 1.1.0f版中的符号OPENSSL_sk_num已经转移到libcrypto.a。 python 3的编译似乎并没有链接它,因此缺少了符号。但是,我错了。当文件Modules/Setup.dist被修改为选择您自己的openssl版本时,您需要将其复制到Modules/Setup,否则它将使用已安装的ssl。