Как мне получить поддержку NPN для pyOpenSSL?

#python #openssl #pyopenssl

#python #openssl #pyopenssl

Вопрос:

У меня есть приложение, которое использует pyOpenSSL. Это зависит от использования NPN. Раньше это работало, но когда я заново создал свою виртуальную среду, версия openssl pyOpenSSL, созданная для pyOpenSSL, больше не поддерживает NPN:

 Traceback (most recent call last):
  File "/tmp/sbpv/http2/proxy1/test_proxy.py", line 60, in <module>
    sys.exit(main())
  File "/tmp/sbpv/http2/proxy1/test_proxy.py", line 46, in main
    proxy_http2.configure_http2_server(args.listen_port, args.server_port, args.https_pem)
  File "/home/bneradt/repos/proxy-verifier/test/autests/gold_tests/autest-site/proxy_http2.py", line 188, in configure_http2_server
    context.set_npn_advertise_callback(npn_advertise_cb)
  File "/home/bneradt/.local/share/virtualenvs/autests-kCEHOjhw/lib/python3.8/site-packages/OpenSSL/SSL.py", line 650, in explode
    raise NotImplementedError(error)
NotImplementedError: NPN not available
  

Текущая версия pyOpenSSL — 19.1.0. Я вернулся к pyOpenSSL 19.0.0 и 18.0.0, но все они, похоже, были созданы для openssl1.1.1h:

 $ python -c "import OpenSSL; print(OpenSSL.version.__version__)"
18.0.0

$ python -c "import OpenSSL; print(OpenSSL.SSL.SSLeay_version(OpenSSL.SSL.SSLEAY_VERSION))"                                                                                                                                                
b'OpenSSL 1.1.1h  22 Sep 2020'

$ python -c "import OpenSSL; print(OpenSSL._util.lib.Cryptography_HAS_NEXTPROTONEG)"                                                                                                                                                          
0
  

Регулярно ли обновляются версии openssl, для которых pyOpenSSL создан, чтобы мои последние установки имели разные версии openssl? Или я не понимаю, как это работает, и pyOpenSSL каким-то образом использует какую-то локальную версию openssl?

Если быть кратким, вопрос, который я задаю: как мне получить версию pyOpenSSL с поддержкой NPN?

Ответ №1:

pyOpenSSL не поставляется со встроенной версией openssl. Вместо этого он полагается на модуль Python Cryptography для этого. Если я установлю версию cryptography на 2.8, то pyOpenSSL версии 19.1.0 использует версию openssl с поддержкой NPN:

 $ python -c "import OpenSSL; print(OpenSSL._util.lib.Cryptography_HAS_NEXTPROTONEG)"
1