Einrichten des https-Cookies in nodejs

Aug 23 2020

Ich versuche auch, ein Anmeldesystem auf meiner Website einzurichten.

Ich habe gehört, dass NodeJS Cookies ein guter Weg sind, dies zu tun.

In den folgenden Links:
https://stackoverflow.com/a/21809393/322537
https://nodejs.org/dist/latest-v8.x/docs/api/https.html
Ich habe ein Beispiel gefunden, wie https-Server erstellt werden. Nach meinem Verständnis sollte die Funktion createServer jedes Mal ausgeführt werden, wenn ein Client eine Anforderung stellt.

Ich habe also Folgendes in meinem Code:

var server_https=modules.https.createServer({
    key: this.ssl_key,
    cert:this.ssl_cert
    },this.respond_to_client).listen(this.port);


mconnection.prototype.respond_to_client=function(request,response){
    console.log('responded to client');
    }

Der Server scheint einwandfrei zu laufen, da die Website betriebsbereit ist. Die Funktion " reply_to_client" scheint jedoch niemals ausgeführt zu werden, da die Protokolldatei von nodejs niemals die Zeichenfolge "Auf Client geantwortet" angibt.

Wie kann das sein? Könnte es etwas damit zu tun haben, dass ich den https-Server kurz später im Code auf einen Websocket aktualisiere?

Update:
Hier ist die Serverdatei:
https://openage.org/s.js
Hier ist das Verbindungsmodul:
https://openage.org/c.js

und hier ist das Chat-Programm, das die dienen
https://openage.org/chat/14/?page=index

Es ist geplant, Cookies zu erstellen, um Kunden zu identifizieren und anschließend ein Anmeldesystem einzurichten. Aber ich stecke dabei fest. /:

Antworten

3 factorypolaris Aug 26 2020 at 17:27

Ich habe Ihre Knotenskripte für lokale Tests repliziert. Ich habe zuerst Dinge auf http (vs https) zum Laufen gebracht und konnte eine gute Antwort bekommen. Beim Wechsel zu https wird die Anforderung jedoch nie vom Server empfangen. Der Browser MUSS zuerst eine sichere Verbindung herstellen, bevor die eigentliche Anfrage gesendet wird.

Beim Versuch, mehrere Server (https und ws) auf demselben Port auszuführen, ist ein ähnliches Problem aufgetreten. Was Sie haben, ist sehr nah, jedoch muss Ihr Setup für https.createServer ({options}, Handler) angepasst werden.

Wo du hast:

var server_https= https.createServer({
        key: this.ssl_key,
        cert:this.ssl_cert
},respond_to_client).listen(this.port);

Sie müssen auch eine Option für "ca" hinzufügen:

var server_https= https.createServer({
        key: this.ssl_key,
        cert: this.ssl_cert,
        ca: this.ssl_ca,  // also add this
},respond_to_client).listen(this.port);

Der Wert, den ich für "ca" verwendet habe, war der Inhalt der Datei: intermediär.crt, die von der Zertifikatsignierungsbehörde empfangen wurde.


WICHTIG

Es ist zwar möglich, dies mit einem selbstsignierten Zertifikat zum Laufen zu bringen, aber ich war noch nie dazu in der Lage, da es keine Signaturberechtigung gibt.


Genau wie Sie es für Ihre anderen Zertifikatdateien getan haben, sollten Sie dies auch für die Datei intermediär.crt tun.

//Where you read your other cert files: add another.
this.ssl_ca = modules.fs.readFileSync(this.ssl_ca_pathfile);

Ich fand das schwierig und schlecht dokumentiert. Ich bin kein Experte für SSL / TSL, aber eine schnelle Suche nach Zwischenzertifikaten wird angezeigt:

Ein Zwischenzertifikat ist ein untergeordnetes Zertifikat, das vom vertrauenswürdigen Stamm speziell für die Ausstellung von Serverzertifikaten für Endentitäten ausgestellt wird. Das Ergebnis ist eine Zertifikatskette, die an der vertrauenswürdigen Stammzertifizierungsstelle über die Zwischenstufe beginnt und mit dem Ihnen ausgestellten SSL-Zertifikat endet. Solche Zertifikate werden als verkettete Stammzertifikate bezeichnet. Quelle

intermediär.crt hat folgende Struktur:

-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
****
-----END CERTIFICATE-----

Hier ist die Antwort im Browser.