shadowsocks-sslocal-undefined-symbol

使用 Shadowsocks 的客户端 sslocal 时,有如下报错信息:

1
2
3
4
5
6
7
8
9
10
11
12
...
...
...
File "/usr/lib/python2.7/site-packages/shadowsocks/crypto/openssl.py", line 76, in __init__
load_openssl()
File "/usr/lib/python2.7/site-packages/shadowsocks/crypto/openssl.py", line 52, in load_openssl
libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)
File "/usr/lib64/python2.7/ctypes/__init__.py", line 373, in __getattr__
func = self.__getitem__(name)
File "/usr/lib64/python2.7/ctypes/__init__.py", line 378, in __getitem__
func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup

查阅相关资料

解决openssl升级到1.1.0后shadowsocks服务报错问题

主要原因: openssl 升级至 1.1.0 后,废弃了EVP_CIPHER_CTX_cleanup 函数,并用 EVP_CIPHER_CTX_reset 函数替代了EVP_CIPHER_CTX_cleanup 函数。
解决方法 :替换程序中对 EVP_CIPHER_CTX_cleanup 的引用。

  1. 编辑 报错的文件,如上面示例中的

    /usr/lib/python2.7/site-packages/shadowsocks/crypto/openssl.py

  2. 将第52行

    libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)

    改为

    libcrypto.EVP_CIPHER_CTX_reset.argtypes = (c_void_p,)`

  3. 将第111行

    ibcrypto.EVP_CIPHER_CTX_cleanup(self._ctx)

    改为

    libcrypto.EVP_CIPHER_CTX_reset(self._ctx)

  4. 保存文件
文章作者: dennyellen
文章链接: http://yoursite.com/2017/10/21/shadowsocks-sslocal-undefined-symbol/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 瞎BB!