In Client-Zertifikat und SSL Python App Aufruf Elasticsearch

stimmen
0

So habe ich eine Elasticsearch Cluster, die ich über eine ACL geschützt http Endpunkt von .Net Web Services wurde zuzugreifen. Ich habe einen neuen Reverse-Proxy hochgedreht, die SSL verwendet und erfordert ein Client-Zertifikat die Anforderung an dem (jetzt geschützt) Elasticsearch Cluster zu übermitteln.

Ich habe dies alles funktioniert gut in .Net, aber ich habe einen Dienst, dass ich das Laufen Python geerbt. Ich habe nicht mit Python viel gearbeitet und bin kämpfen, um herauszufinden, wie diese umzusetzen.

Ich verwende ES 2.3.2 und Python 3.2.

Für .Net, habe ich das Zertifikat auf dem Hosting-Rechner installiert, wo der Code direkt aus dem Laden zieht. Ich habe OpenSSL verwendet und exportiert diese in eine .pem (sowie .crt und .key als auch). Die Probleme, die ich bin die Begegnung sind A), wie der Transport zu bekommen https statt http zu sein, und B), wie mein cert aufzunehmen. Ich zum ersten Mal versucht:

client = Elasticsearch(hosts=[self.host], timeout=80, use_ssl=True, verify_certs=True, client_cert=cert_file_path, client_key=key_file_path)

Dies scheint nicht zu funktionieren. Also dachte ich, ich brauchte, um meine eigene Verbindung / Verkehr aufzubauen, so dass ich versucht, dies:

    connection = Urllib3HttpConnection(host=self.host['host'], port=self.host['port'], use_ssl=True,ca_certs=cert_file_path, client_cert=cert_file_path, client_key=key_file_path, verify_certs=True )
    transport = Transport(hosts=[self.host], connection_class=connection)
    client = Elasticsearch(hosts=[self.host], timeout=80, use_ssl=True, verify_certs=True, Transport=transport, client_cert=cert_file_path, client_key=key_file_path)

Ich muss manuell im Debugger das Schema ‚https‘ ändern, aber wenn ich mich jetzt, erhalte ich:

TypeError('Urllib3HttpConnection' object is not callable,)

In .Net, was ich tue, ist die Httpconnection in dem ConnectionSetings für das ElasticClient überschreibt. Darin überschreiben ich CreateHttpWebRequest und fügen Sie mein Zertifikat an den Outbound-Anfrage:

// add the cert to the collection

webRequest.ClientCertificates.Add(this.clientCertificate);

Es scheint, dies sollte eine gemeinsame Sache zu tun, aber ich kann es nicht herausgefunden (obwohl das auf meinen Mangel an Python Erfahrung zurückzuführen sein könnte).

Alle helfen da draußen?

Vielen Dank! ~ john

AKTUALISIEREN

Also hier ist die Definition meiner Gastgeber:

{use_ssl: True, host: [my server].cloudapp.net, port: 443, scheme: https, transport_schema: https}

Aus der Dokumentation :

kwargs – any additional arguments will be passed on to the Transport class and, subsequently, to the Connection instances.

Ich würde davon ausgehen, dass die Regelung und / oder transport_schema würde durch weitergeleitet werden.

Ich schaffe den Client als:

client = Elasticsearch(hosts=[self.host], timeout=80, use_ssl=True, scheme=https, verify_certs=True, client_cert=cert_file_path, client_key=key_file_path)

Wenn ich den Client zu erstellen, erhalte ich:

ERROR  Exception encountered.  Detailed info: ImproperlyConfigured('Scheme specified in connection (https) is not the same as the connection class (Urllib3HttpConnection) specifies (http).',)

Dies geschieht in transport.py in _create_connection ():

        if 'scheme' in host and host['scheme'] != self.connection_class.transport_schema:

            raise ImproperlyConfigured(

                'Scheme specified in connection (%s) is not the same as the connection class (%s) specifies (%s).' % (

                    host['scheme'], self.connection_class.__name__, self.connection_class.transport_schema

            ))

Als ich hier brechen, kann ich sehen, dass:

self.kwargs [ 'transport_schema'] = 'https'

aber:

self.connection_class.transport_schema = 'http'

Ich hätte gedacht, dass die kwarg weitergeleitet wurden den connection_class würden. Ich habe manuell die transport_schema auf ‚https‘ und dies ermöglicht es mir, nach diesem Fehler zu erhalten.

Das ist also der erste Teil. Nachdem Sie das getan, erhalte ich ein Zertifikat Validierungsfehler. Dies ist wahrscheinlich auflösbar, ich habe noch zu diesem Teil einfach nicht durchgemacht. Die Probleme sind hier:

A) Ich bin für eine Passphrase aufgefordert. Wie kann ich liefern das? Dies ist ein Service, der unbeaufsichtigt laufen wird.

B) Wie auch immer, wenn ich liefern sie, erhalte ich:

GET https: // [myServer] .cloudapp.net: 443 / ocv_int / _search request_cache = true [Status: N / A Anfrage: 6.085s] Traceback (jüngste Aufforderung zuletzt): Die Datei „E: \ Source \ Repos \ OfficeCustomerVoice \ UserExperience \ OCVClusteringWebAPI \ ENV3 \ lib \ site-packages \ urllib3 \ connectionpool.py Linie 578, in urlopen chunked = chunked) Datei E: \ Source \ Repos \ OfficeCustomerVoice \ UserExperience \ OCVClusteringWebAPI \ ENV3 \ lib \ site-packages \ urllib3 \ Connection Py“, Linie 351, in _make_request self._validate_conn (conn) Datei E: \ Source \ Repos \ OfficeCustomerVoice \ UserExperience \ OCVClusteringWebAPI \ ENV3 \ lib \ site-packages \ urllib3 \ connectionpool.py, Linie 814, in _validate_conn conn.connect () Datei E: \ Source \ Repos \ OfficeCustomerVoice \ UserExperience \ OCVClusteringWebAPI \ ENV3 \ lib \ site-packages \ urllib3 \ connection.py, Linie 289,in connect ssl_version = resolved_ssl_version) Datei E: \ Source \ Repos \ OfficeCustomerVoice \ UserExperience \ OCVClusteringWebAPI \ ENV3 \ lib \ site-packages \ urllib3 \ util \ ssl_.py, Linie 308, in ssl_wrap_socket Rückkehr context.wrap_socket (Socke, server_hostname = server_hostname) Datei C: \ Benutzer \ jthoni \ AppData \ Local \ Continuum \ Anaconda3-2-3 \ lib \ ssl.py, Linie 365, in wrap_socket _context = self) Datei „C: \ Benutzer \ jthoni \ AppData \ Local \ Continuum \ Anaconda3-2-3 \ lib \ ssl.py“, Linie 583, inLinie 365, in wrap_socket _context = self) Datei C: \ Benutzer \ jthoni \ AppData \ Local \ Continuum \ Anaconda3-2-3 \ lib \ ssl.py, Linie 583, inLinie 365, in wrap_socket _context = self) Datei C: \ Benutzer \ jthoni \ AppData \ Local \ Continuum \ Anaconda3-2-3 \ lib \ ssl.py, Linie 583, ininit self.do_handshake () Datei C: \ Benutzer \ jthoni \ AppData \ Local \ Continuum \ Anaconda3-2-3 \ lib \ ssl.py, Linie 810, in do_handshake self._sslobj.do_handshake () ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] Zertifikat überprüfen failed (_ssl.c: 600)

Während der oben genannten Ausnahmebehandlung erfolgt eine weitere Ausnahme:

Traceback (jüngste Aufforderung zuletzt): Die Datei E: \ Source \ Repos \ OfficeCustomerVoice \ UserExperience \ OCVClusteringWebAPI \ ENV3 \ lib \ site-packages \ Elasticsearch \ Verbindung \ http_urllib3.py, Linie 94, in perform_request response = self.pool .urlopen (Methode, url, Körper, Wiederholungen = false, headers = self.headers, ** kw) Datei „E: \ Source \ Repos \ OfficeCustomerVoice \ UserExperience \ OCVClusteringWebAPI \ ENV3 \ lib \ site-packages \ urllib3 \ Connection. py“, Linie 604, in urlopen erhöhen SSLError (e) urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] Zertifikat verifizieren fehlgeschlagen (_ssl.c: 600)

PS meine cert-Dateien zu erhalten Ich habe folgendes mit meiner pfx-Datei:

openssl pkcs12 -in E:\[myCert].pfx -out E:\[myCert].pem -nodes
openssl pkcs12 -in E:\[myCert].pfx -nocerts -out E:\[myCert].key
openssl pkcs12 -in E:\[myCert].pfx -clcerts -nokeys -out E:\[myCert].crt
Veröffentlicht am 12/05/2017 um 00:49
vom benutzer
In anderen Sprachen...                            

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more