2017-02-08 142 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。