2017-03-06 4 views
0

Ich habe zwei Server konfiguriert und läuft auf meinem Debian-Server. Ein Hauptserver und ein Elasticsearch (Suchmaschine) Server.Javascript erhalten Anfrage von https-Server an localhost: Port mit selbst signierten SSL

Der Hauptserver läuft auf einem https-Knotenserver mit einem NGINX-Proxy und einem erworbenen SSL-Zertifikat. Der Elasticsearch-Server wird auf einem HTTP-Server ausgeführt. Ich habe einen neuen NGINX-Proxy-Server hinzugefügt, um https://localhost:9999 mit einem selbst signierten SSL-Zertifikat an http://localhost:9200 umzuleiten. Es gibt auch eine konfigurierte Authentifizierung auf dem Elasticsearch-Server mit einem Benutzernamen und einem Passwort.

Alles scheint richtig konfiguriert werden, da ich eine erfolgreiche Antwort vom Server erhalten können, wenn ich eine Locke aus dem Server-Terminal in Richtung https://localhost:9999 mit dem -k Option macht die KONTROLLE DER der selbst signiertes Zertifikat zu umgehen Ohne es geht es nicht.

Ich kann keine Cross-Domain-Anfrage von meinem https-Hauptserver zu meinem http localhost-Server. Deshalb muss ich https auf meinem localhost Server konfigurieren.


Ohne die -k Option:

curl: (60) SSL certificate problem: self signed certificate 
More details here: http://curl.haxx.se/docs/sslcerts.html 

curl performs SSL certificate verification by default, using a "bundle" 
of Certificate Authority (CA) public keys (CA certs). If the default 
bundle file isn't adequate, you can specify an alternate file 
using the --cacert option. 
If this HTTPS server uses a certificate signed by a CA represented in 
the bundle, the certificate verification probably failed due to a 
problem with the certificate (it might be expired, or the name might 
not match the domain name in the URL). 
If you'd like to turn off curl's verification of the certificate, use 
the -k (or --insecure) option. 

Mit der -k Option:

{ 
    "name" : "server-name", 
    "cluster_name" : "name", 
    "cluster_uuid" : "uuid", 
    "version" : { 
    "number" : "x.x.x", 
    "build_hash" : "abc123", 
    "build_date" : "Timestamp", 
    "build_snapshot" : false, 
    "lucene_version" : "x.x.x" 
    }, 
    "tagline" : "You Know, for Search" 
} 

, die eine erfolgreiche Antwort Elasticsearch Servers ist.


So sieht die vollständige Curl-Anforderung so etwas wie curl -k https://localhost:9999/ --user username:password.

So ist die eigentliche Frage:

Ich möchte in der Lage sein, einen einfachen jQuery AJAX-Request auf diesem Server zu tun. Ich versuche mit der folgenden Anfrage $.get('https://username:[email protected]:9999/'), aber ich bekomme ERR_CONNECTION_REFUSED.

Meine Vermutung ist, dass die AJAX-Anfrage die Überprüfung des selbstsignierten Zertifikats nicht umgeht und daher die Verbindung verweigert.

Gibt es eine einfache Möglichkeit, dies mit Anforderungsheadern oder etwas ähnlichem zu lösen? Oder muss ich ein CA-Zertifikat erwerben, damit dies mit AJAX funktioniert?

Antwort

1

Sie haben Recht, das Problem ist das selbstsignierte Zertifikat.Wenn Sie die gleiche Anfrage, aber als http versuchen, wird es funktionieren.Hier

ist eine Abhilfe zu machen Elasticsearch mit https arbeiten:

Sie müssen Ihre eigenen Http-Connector implementieren:

var HttpConnector = require('elasticsearch/src/lib/connectors/http'); 
var inherits = require('util').inherits; 
var qs = require('querystring'); 
var fs = require('fs'); 

function CustomHttpConnector(host, config) { 
    HttpConnector.call(this, host, config); 
} 

inherits(CustomHttpConnector, HttpConnector); 

// This function is copied and modified from elasticsearch-js/src/lib/connectors/http.js 
CustomHttpConnector.prototype.makeReqParams = function (params) { 
    params = params || {}; 
    var host = this.host; 

    var reqParams = { 
    method: params.method || 'GET', 
    protocol: host.protocol + ':', 
    auth: host.auth, 
    hostname: host.host, 
    port: host.port, 
    path: (host.path || '') + (params.path || ''), 
    headers: host.getHeaders(params.headers), 
    agent: this.agent, 
    rejectUnauthorized: true, 
    ca: fs.readFileSync('publicCertificate.crt', 'utf8') 
    }; 

    if (!reqParams.path) { 
    reqParams.path = '/'; 
    } 

    var query = host.getQuery(params.query); 
    if (query) { 
    reqParams.path = reqParams.path + '?' + qs.stringify(query); 
    } 

    return reqParams; 
}; 

module.exports = CustomHttpConnector; 

Dann registrieren sie etwa so:

var elasticsearch = require('elasticsearch'); 
var CustomHttpConnector = require('./customHttpConnector'); 

    var Elasticsearch = function() { 
     this.client = new elasticsearch.Client({ 
     host: { 
      host: 'my.server.com', 
      port: '443', 
      protocol: 'https', 
      auth: 'user:passwd' 
     }, 
     keepAlive: true, 
     apiVerison: "1.3", 
     connectionClass: CustomHttpConnector 
     }); 
    } 

https://gist.github.com/fractalf/d08de3b59c32197ccd65

Wenn Sie einfache Ajax-Anrufe machen möchten, nicht Sie sing ES ist das einzige, was Sie tun können, den Benutzer aufzufordern, die Seite zu besuchen und das Zertifikat selbst zu akzeptieren, wenn die Anfrage abgelehnt wird.

Siehe auch: https://stackoverflow.com/a/4566055/5758328

+0

Vielen Dank für Ihre Antwort. Ich werde es versuchen und zu dir zurückkommen. –

+0

Bedeutet das, dass ich eine Anfrage an mein Node-Backend stellen muss und eine Anfrage an es senden muss und die Antwort zurück an das Frontend schicken soll? Oder kann ich das mit reinem Frontend lösen? Ich bin mir nicht 100% sicher, was in diesem Beispiel passiert :) Ich konnte Elasticsearch mit Ihrem Beispiel konfigurieren und den https-Server erfolgreich pingen. –

+0

In diesem Beispiel wird ElasticSearch angewiesen, eine benutzerdefinierte Verbindungsklasse zu verwenden, um seine AJAX-Anforderungen auszuführen. Sehen Sie meine Bearbeitung oben. – Mawcel

Verwandte Themen