Probleme mit SNI und Python 2.7.6

Python 2.7.6 beherrscht die Server Name Indication (SNI) Erweiterung für SSL noch nicht.

Zugriffe auf HTTP Server, die SNI einsetzen, werden bei der Prüfung des Zertifikats zurückgewiesen. Beispielsweise:

connection error: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Als allererstes haben wir das hier bemerkt:

Wollte eben eine Annotation posten und bekomme bei

http POST https://swarm.hiveeyes.org/api/hiveeyes/testdrive/area-42/node-1/event reference='testdrive' title='Balcony testing' text='From now on testing the sensor node on the balcony.' tags='status' time='2017-04-02T10:01:00'

folgenden output:

http: error: SSLError: hostname 'swarm.hiveeyes.org' doesn't match
'luftdaten.getkotori.org'"

Ein schneller Workaround:

http --verify=no POST https://swarm.hiveeyes.org/api/hiveeyes/testdrive/area-42/node-1/event reference='testdrive' title='Balcony testing' text='From now on testing the sensor node on the balcony.' tags='status' time='2017-04-02T10:01:00'

Heute haben wir es auch hier bemerkt:

Kann es sein, dass das Root CA Zertifikat von Let’s Encrypt noch nicht auf dem System installiert ist? Oder was vermutest Du als Ursache?


Auch hier kann die SSL/HTTP Bibliothek scheinbar kein SNI. @mois hatte gerade ähnliche Probleme beim Absetzen von Annotations mit HTTPie. Wir haben doch schon 2017?


Das arbeitet ohne SNI und gibt so das falsche Zertifikat aus. Mit dem Parameter -servername packages.hiveeyes.org klappts besser:

openssl s_client -servername packages.hiveeyes.org -connect packages.hiveeyes.org:443 -showcerts | openssl x509 -text

Mit dem richtigen Zertifikat könnte das dann tatsächlich funktionieren…


Exzellent!


Interessieren würden mich aber schon die Gründe, warum anfangs [quote=“weef, post:10, topic:228”]
SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
[/quote]

kommt. Dieses Problem trat bei unseren heutigen Installationsversuchen auf dem LinkIt jedenfalls nicht auf.

ahh… ja! OK, jetzt versteh ich, warum Du von LE gesprochen hast - da ist ja noch ein anderes cert, nämlich das richtige ,) !

Das ist Python 2.7.6, SNI kann das noch nicht.

Dachte ich ja auch …leider dann doch noch nicht (pip 1.5.4). Ich evaluiere das mal weiter.

Schade! Kam das zwischen 2.7.6 und 2.7.11 dazu? Bei mir geht das:

$ python
Python 2.7.11 (default, Mar  4 2016, 20:35:41)

>>> requests.__version__
'2.2.1'

>>> import requests
>>> requests.get('https://swarm.hiveeyes.org/api/hiveeyes/kh/cfb/hive1/data.txt?from=2017-04-02T11:00:00&to=2017-04-02T12:00:00')
<Response [200]>

Update: Tatsache, erst ab 2.7.9+:

Python3 and Python 2.7.9+ include native support for SNI in their SSL modules.
Frequently Asked Questions — Requests 2.21.0 documentation

Vielleicht ein Lichtblick?

For information on using SNI with Requests on Python < 2.7.9 refer to this Stack Overflow answer.

Ja, das klappt! Sogar auf einem noch älteren Python:

$ python -V
Python 2.7.3

Am Besten zum Testen bzw. zur Isolation gegenüber der Linux Distribution in einem virtualenv:

$ virtualenv venv-sni
$ venv-sni/bin/pip install requests pyOpenSSL idna

Und dann mit dem gerade veredelten SNI-fähigen Python:

$ venv-sni/bin/python
>>> import requests
>>> requests.head('https://swarm.hiveeyes.org/')
<Response [302]>

klappt - pyOpenSSL und pyasn1 hatte ich schon, bei mir fehlte der ndg-httpsclient !

Immerhin habe ich keine SSL/cert verify -Fehler mehr, aber beradio will immer noch nicht, jetzt kommt ein 404 bei pyserial (das ist aber schon in v2.6 durch weewx dabei):

Could not fetch URL https://packages.hiveeyes.org/hiveeyes/python/eggs/pyserial/: 404 Client Error: Not Found

Aber wir kamen ja von kleineren Plattformen: für LEDE/OpenWRT targets mit 8M finde ich ja pip und setuptools kompletten Luxus, aber Ihr habt ja im LinkItSmart Duo etwas mehr flash! ,) Generell ist mir wichtiger, daß auf den Maschinen wget verschlüsselt übertragen kann.

Du hattest bei Dir noch

pip install -v --index-url=

verwendet. Das war auch ein anfängliches Problem bei @einsiedlerkrebs, das wir durch Aktualisierung der Dokumentation behoben haben, siehe:

Es muss nun also richtig heißen:

pip install -v --extra-index-url=

Die vollständige Zeile zur Installation von BERadio ist also:

pip install --extra-index-url=https://packages.hiveeyes.org/hiveeyes/python/eggs/ beradio