편집하다

편집하다

Shadowsocks 프로필을 구성할 때 이 문제가 발생했습니다.

$ ssserver -c profile.json
/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/common.py:221: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if addr is "":
/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/common.py:233: SyntaxWarning: "is" with a literal. Did you mean "=="?
  if len(block) is 1:
/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/common.py:235: SyntaxWarning: "is not" with a literal. Did you mean "!="?
  while (ip & 1) == 0 and ip is not 0:
INFO: loading config from profile.json
Traceback (most recent call last):
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/bin/.ssserver-real", line 11, in <module>
    load_entry_point('shadowsocks==3.0.0', 'console_scripts', 'ssserver')()
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/server.py", line 34, in main
    config = shell.get_config(False)
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/shell.py", line 355, in get_config
    check_config(config, is_local)
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/shell.py", line 210, in check_config
    cryptor.try_cipher(config['password'], config['method'],
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/cryptor.py", line 51, in try_cipher
    Cryptor(key, method, crypto_path)
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/cryptor.py", line 98, in __init__
    self.cipher = self.get_cipher(
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/cryptor.py", line 130, in get_cipher
    return m[METHOD_INFO_CRYPTO](method, key, iv, op, self.crypto_path)
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/crypto/openssl.py", line 150, in __init__
    OpenSSLCryptoBase.__init__(self, cipher_name, crypto_path)
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/crypto/openssl.py", line 98, in __init__
    load_openssl(crypto_path)
  File "/gnu/store/yvjgk9n6xzpr32maq1mqw1ij2vhm9jxb-shadowsocks-2.8.2-0.e332ec9/lib/python3.8/site-packages/shadowsocks/crypto/openssl.py", line 51, in load_openssl
    raise Exception('libcrypto(OpenSSL) not found with path %s' % path)
Exception: libcrypto(OpenSSL) not found with path None

해결책은 무엇입니까?

답변1

편집하다

이 글을 쓰는 시점에서 나보다 소스 코드를 더 잘 아는 사람이 디자인했습니다.패치, Guix 업스트림에 제출되었습니다. 즉, 이 문제는 곧 해결될 수도 있습니다.

원본 게시물

Shadowsocks의 패키지 정의를 보면 OpenSSL을 입력으로 나열하지 않고 거의 아무것도 없는 것처럼 보입니다. 또한, Shadowsocks는 이러한 모든 경로를 일부 구성에 저장하기를 원하는 것 같습니다.

config['crypto_path'] = {'openssl': config['libopenssl'],
                         'mbedtls': config['libmbedtls'],
                         'sodium': config['libsodium']}

이러한 트릭은 전통적인 배포판(예: Debian 기반 배포판 등)에서는 매우 영리할 수 있지만 모든 종류의 패키지 관리와 결합하면 완전히 깨집니다. Guix가 이런 종류의 문제를 처리하는 방식은 빌드 타임에 있습니다 substitute*. 스테이지는 다음과 같습니다:

  (add-after 'unpack 'patch-crypto-paths
    (lambda* (#:key inputs #:allow-other-keys)
      (substitute* "shadowsocks/shell.py"
        (("config\\['libopenssl'\\]") 
         (string-append (assoc-ref inputs "openssl") "/path/to/libopenssl"))
        [...])
      #t))

[위 코드는 분명히 Guix 코드이므로 SO가 일반적으로 CC BY-SA를 시행하더라도 GPLv3+에서 자유롭게 사용할 수 있습니다. ]

#t요즘에는 in으로 끝나는 것이 꼭 필요한 것은 아니지만 Guix 코드에서는 여전히 자주 찾을 수 있을 것입니다.

관련 정보