J'essaie de me connecter à Stripe pour configurer les paiements. Je le fais fonctionner sur ma machine de développement, mais lorsque je pousse pour produire, j'obtiens l'erreur SSL suivante:
Impossible de se connecter à l'URL HTTPS car le module SSL n'est pas disponible.
Voici les détails de ma configuration:
J'ai lu plusieurs autres SO réponses qui suggèrent de réinstaller python, mais pour être sûr d'installer d'abord les dépendances. Cela ne devrait pas être un problème lors de l'installation à l'intérieur et l'environnement anaconda devrait-il le faire? Ne devrait pas anaconda s'occupe de toutes les dépendances pour moi?
J'ai HTTPS activé et travaille pour l'ensemble du domaine (toutes les demandes sont acheminées vers https). Quand je vérifie mon installation, j'ai openssl et quand j'ouvre un shell dans mon environnement Django, je peux importer et utiliser le module sans problème ... donc je ne sais pas comment pour continuer à résoudre le problème.
Toute aide est très appréciée!
Voici également une trace de pile:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in urlopen
589. conn = self._get_conn(timeout=pool_timeout)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in _get_conn
251. return conn or self._new_conn()
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in _new_conn
827. raise SSLError("Can't connect to HTTPS URL because the SSL "
During handling of the above exception (Can't connect to HTTPS URL because the SSL module is not available.), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/adapters.py" in send
440. timeout=timeout
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/connectionpool.py" in urlopen
639. _stacktrace=sys.exc_info()[2])
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/urllib3/util/retry.py" in increment
388. raise MaxRetryError(_pool, url, error or ResponseError(cause))
During handling of the above exception (HTTPSConnectionPool(Host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in request
121. **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/sessions.py" in request
508. resp = self.send(prep, **send_kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/sessions.py" in send
618. r = adapter.send(request, **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/requests/adapters.py" in send
506. raise SSLError(e, request=request)
During handling of the above exception (HTTPSConnectionPool(Host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",))), another exception occurred:
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/Django/core/handlers/exception.py" in inner
41. response = get_response(request)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/Django/core/handlers/base.py" in _get_response
187. response = self.process_exception_by_middleware(e, request)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/Django/core/handlers/base.py" in _get_response
185. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/Django/views/decorators/csrf.py" in wrapped_view
58. return view_func(*args, **kwargs)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/Django/contrib/auth/decorators.py" in _wrapped_view
23. return view_func(request, *args, **kwargs)
File "/home/user/protectyourreviews/protectyourreviews/../payments/views.py" in stripe_test
35. source=token
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/resource.py" in create
467. response, api_key = requestor.request('post', url, params, headers)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/api_requestor.py" in request
150. method.lower(), url, params, headers)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/api_requestor.py" in request_raw
335. method, abs_url, headers, post_data)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in request
139. self._handle_request_error(e)
File "/home/user/miniconda3/envs/protectyourreviews/lib/python3.6/site-packages/stripe/http_client.py" in _handle_request_error
159. raise error.APIConnectionError(msg)
Exception Type: APIConnectionError at /payments/test/stripe/
Exception Value: Unexpected error communicating with Stripe. If this problem persists,
let us know at [email protected].
(Network error: SSLError: HTTPSConnectionPool(Host='api.stripe.com', port=443): Max retries exceeded with url: /v1/customers (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)))
Modifier
Après avoir réinstallé mod_wsgi dans un nouveau python virtualenv, il essaie toujours d'ouvrir l'ancien chemin anaconda. J'ai changé les directives python-home et python-path dans WSGIDaemonProcess, mais peu importe ce que J'essaye, il essaye toujours d'ouvrir python du répertoire miniconda3 (que j'ai supprimé).
Voici une trace des journaux d'erreurs Apache:
Current thread 0x00007f99f6769780 (most recent call first):
[Mon Aug 28 20:13:15.264466 2017] [core:notice] [pid 26528] AH00051: child pid 26775 exit signal Aborted (6), possible coredump in /etc/Apache2
[Mon Aug 28 20:13:15.264608 2017] [core:notice] [pid 26528] AH00051: child pid 26776 exit signal Aborted (6), possible coredump in /etc/Apache2
[Mon Aug 28 20:13:16.340556 2017] [wsgi:info] [pid 26789] mod_wsgi (pid=26789): Python home /home/user/miniconda3/envs/protectyourreviews.
[Mon Aug 28 20:13:16.341203 2017] [wsgi:warn] [pid 26789] (2)No such file or directory: mod_wsgi (pid=26789): Unable to stat Python home /home/user/miniconda3/envs/protectyourreviews. Python interpreter may not be a$
[Mon Aug 28 20:13:16.341357 2017] [wsgi:info] [pid 26789] mod_wsgi (pid=26789): Initializing Python.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Modifier 2
Oui, j'ai commencé à partir d'un répertoire source propre. J'ai copié le fichier tar mod_wsgi dans le nouveau répertoire et j'ai exécuté configure/make/make install dans le nouveau répertoire. Je crois que j'ai également supprimé les fichiers du module Apache avant la nouvelle installation au cas où.
J'ai essayé plusieurs itérations des directives ci-dessous (les deux/seulement python-home/seulement python-path) mais peu importe ce que j'essaie, je ne peux pas comprendre pourquoi mod_wsgi continue de chercher dans le dossier miniconda3 supprimé. Y a-t-il un autre fichier de configuration que j'oublie?
Voici mon wsgi.load:
LoadModule wsgi_module /usr/lib/Apache2/modules/mod_wsgi.so
Voici mes directives Apache2 (où pyr_env est mon nouveau Python virtualenv):
WSGIDaemonProcess protectyourreviews python-home=/home/user/pyr_env/ python-path=/home/user/protectyourreviews
WSGIProcessGroup protectyourreviews
WSGIScriptAlias / /home/user/protectyourreviews/zz_test/test.wsgi
<Directory /home/user/protectyourreviews/zz_test>
<Files test.wsgi>
Require all granted
</Files>
</Directory>
Modifier 3
J'ai suivi les instructions que vous avez suggérées dans la documentation , et la sortie suit.
Voici la sortie de ldd:
$ ldd /usr/lib/Apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fffad973000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f05b8c02000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f05b89e5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f05b861a000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f05b83f1000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f05b81d7000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f05b7fd2000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f05b7dcf000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f05b7ac6000)
/lib64/ld-linux-x86-64.so.2 (0x0000558bed982000)
Et voici la sortie après la suppression de LD_LIBRARY_PATH:
$ unset LD_LIBRARY_PATH
$ ldd /usr/lib/Apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007ffd91bd2000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f8bec8a6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8bec689000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8bec2be000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f8bec095000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f8bebe7b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8bebc76000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f8beba73000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8beb76a000)
/lib64/ld-linux-x86-64.so.2 (0x000055e8861a5000)
Je me suis assuré que les autorisations sont définies correctement sur le dossier de l'environnement virtuel, et j'ai également recompilé à nouveau pour être absolument sûr d'avoir la bonne version. Voici toutes les entrées et sorties du processus:
#----CHANGE PERMISSIONS OF VIRTUAL ENVIRONMENT
$ Sudo chgrp -R www-data /home/user/pyr_env/
$ Sudo chmod -R g+rwx /home/user/pyr_env/
#----DELETE OLD FOLDER
$ rm -r mod_wsgi-4.5.17/
#----START FRESH WITH CONFIG/MAKE/INSTALL
$ tar xvfz 4.5.17.tar.gz
$ cd mod_wsgi-4.5.17/
$ ./configure --with-python=/usr/bin/python3
$ make
$ Sudo make install
/usr/bin/apxs2 -i -S LIBEXECDIR=/usr/lib/Apache2/modules -n 'mod_wsgi' src/server/mod_wsgi.la
/usr/share/Apache2/build/instdso.sh SH_LIBTOOL='/usr/share/apr-1.0/build/libtool' src/server/mod_wsgi.la /usr/lib/Apache2/modules
/usr/share/apr-1.0/build/libtool --mode=install install src/server/mod_wsgi.la /usr/lib/Apache2/modules/
libtool: install: install src/server/.libs/mod_wsgi.so /usr/lib/Apache2/modules/mod_wsgi.so
libtool: install: install src/server/.libs/mod_wsgi.lai /usr/lib/Apache2/modules/mod_wsgi.la
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/lib/Apache2/modules
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib/Apache2/modules
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
chmod 644 /usr/lib/Apache2/modules/mod_wsgi.so
#----OUTPUT OF LDD
$ ldd /usr/lib/Apache2/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007ffcfb9a9000)
libpython3.5m.so.1.0 => /usr/lib/x86_64-linux-gnu/libpython3.5m.so.1.0 (0x00007f19ae26f000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f19ae052000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f19adc87000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f19ada5e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f19ad844000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f19ad63f000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f19ad43c000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f19ad133000)
/lib64/ld-linux-x86-64.so.2 (0x000055aa1cb7a000)
#----RESTART Apache
$ Sudo Apache2ctl restart
Malheureusement, je vois exactement les mêmes erreurs dans Apache. Voici Apache2/error.log:
Current thread 0x00007fb350fee780 (most recent call first):
[Wed Aug 30 14:13:08.130076 2017] [core:notice] [pid 9754] AH00051: child pid 28636 exit signal Aborted (6), possible coredump in /etc/Apache2
[Wed Aug 30 14:13:08.130179 2017] [core:error] [pid 9754] AH00546: no record of generation 0 of exiting child 28636
[Wed Aug 30 14:13:08.130833 2017] [wsgi:info] [pid 28639] mod_wsgi (pid=28639): Python home /home/user/miniconda3/envs/protectyourreviews.
[Wed Aug 30 14:13:08.130907 2017] [wsgi:warn] [pid 28639] (2)No such file or directory: mod_wsgi (pid=28639): Unable to stat Python home /home/user/minico$
[Wed Aug 30 14:13:08.130992 2017] [wsgi:info] [pid 28639] mod_wsgi (pid=28639): Initializing Python.
[Wed Aug 30 14:13:08.131665 2017] [wsgi:info] [pid 28638] mod_wsgi (pid=28638): Python home /home/user/miniconda3/envs/protectyourreviews.
[Wed Aug 30 14:13:08.131716 2017] [wsgi:warn] [pid 28638] (2)No such file or directory: mod_wsgi (pid=28638): Unable to stat Python home /home/user/minico$
[Wed Aug 30 14:13:08.131782 2017] [wsgi:info] [pid 28638] mod_wsgi (pid=28638): Initializing Python.
Fatal Python error: Py_Initialize: Unable to get the locale encoding
ImportError: No module named 'encodings'
Il essaie toujours d'ouvrir le dossier miniconda qui a été supprimé ...
Le problème est qu'Anaconda Python est livré avec ses propres bibliothèques SSL et n'utilise pas les bibliothèques SSL système lors de la compilation du module ssl Python ssl. Le module mod_ssl dans Apache utilise les bibliothèques système.
Donc, si vous activez mod_ssl dans Apache, il récupère les bibliothèques SSL du système. Lorsque le module ssl Python est importé par votre application, il hérite des bibliothèques SSL système déjà chargées, qui sont différentes de ce pour quoi le module ssl a été compilé et attend, donc il échoue.
Le problème est donc causé par Anaconda Python ignorant les bibliothèques SSL du système et utilisant les siennes.
La seule solution consiste à utiliser le système Python et non Anaconda Python, ou exécuter votre application WSGI en utilisant mod_wsgi-express derrière votre installation principale d'Apache qui ne ferait que servir de point de terminaison pour SSL, puis proxy à l'instance mod_wsgi-express.
Sauf si vous avez une exigence spécifique, il est préférable d'utiliser le système Python et non Anaconda Python.