Ich versuche HTTPS dazu zu bringen, an express.js für node zu arbeiten, und ich kann es nicht herausfinden.
Das ist mein app.js
code.
var express = require('express');
var fs = require('fs');
var privateKey = fs.readFileSync('sslcert/server.key');
var certificate = fs.readFileSync('sslcert/server.crt');
var credentials = {key: privateKey, cert: certificate};
var app = express.createServer(credentials);
app.get('/', function(req,res) {
res.send('hello');
});
app.listen(8000);
Wenn ich es starte, scheint es nur auf HTTP-Anfragen zu antworten.
Ich habe eine einfache Vanilla node.js
-basierte HTTPS-App geschrieben:
var fs = require("fs"),
http = require("https");
var privateKey = fs.readFileSync('sslcert/server.key').toString();
var certificate = fs.readFileSync('sslcert/server.crt').toString();
var credentials = {key: privateKey, cert: certificate};
var server = http.createServer(credentials,function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
});
server.listen(8000);
Und wenn ich diese App starte, reagiert sie auf HTTPS-Anfragen. Beachten Sie, dass ich nicht denke, dass das toString () auf dem fs-Ergebnis von Bedeutung ist, da ich Kombinationen von beiden und immer noch kein es bueno verwendet habe.
BEARBEITEN ZU HINZUFÜGEN:
Für Produktionssysteme ist es wahrscheinlich besser, Nginx oder HAProxy zu verwenden, um Anforderungen an die NodeJS-App zu übermitteln. Sie können nginx so einrichten, dass es die SSL-Anforderungen verarbeitet, und einfach http mit Ihrer Node-App.js sprechen.
BEARBEITEN ZU HINZUFÜGEN (06.04.2015)
Für Systeme, die AWS verwenden, ist es besser, EC2 Elastic Load Balancers zu verwenden, um die SSL-Beendigung zu handhaben und regelmäßigen HTTP-Verkehr zu Ihren EC2-Webservern zuzulassen. Richten Sie aus Sicherheitsgründen Ihre Sicherheitsgruppe so ein, dass nur der ELB HTTP-Datenverkehr an die EC2-Instanzen senden kann, um zu verhindern, dass unverschlüsselter HTTP-Datenverkehr von außen auf Ihre Computer gelangt.
In express.js (seit Version 3) sollten Sie folgende Syntax verwenden:
var fs = require('fs');
var http = require('http');
var https = require('https');
var privateKey = fs.readFileSync('sslcert/server.key', 'utf8');
var certificate = fs.readFileSync('sslcert/server.crt', 'utf8');
var credentials = {key: privateKey, cert: certificate};
var express = require('express');
var app = express();
// your express configuration here
var httpServer = http.createServer(app);
var httpsServer = https.createServer(credentials, app);
httpServer.listen(8080);
httpsServer.listen(8443);
Auf diese Weise stellen Sie dem nativen http/https-Server Express-Middleware zur Verfügung
Wenn Ihre App auf Ports unter 1024 ausgeführt werden soll, müssen Sie den Befehl Sudo
verwenden (nicht empfohlen) oder einen Reverse-Proxy (z. B. Nginx, Haproxy) verwenden.
Zuerst müssen Sie selfsigned.key und selfsigned.crt Dateien erstellen. Gehen Sie zu Selbstsigniertes SSL-Zertifikat erstellen
Gehen Sie zum Terminal und führen Sie den folgenden Befehl aus.
Sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./selfsigned.key -out selfsigned.crt
Nach der Erstellung fügen Sie Ihrem Code die Datei key & cert hinzu und übergeben die Optionen an den Server.
const express = require('express');
const https = require('https');
const fs = require('fs');
const port = 3000;
var key = fs.readFileSync(__dirname + '/../certs/selfsigned.key');
var cert = fs.readFileSync(__dirname + '/../certs/selfsigned.crt');
var options = {
key: key,
cert: cert
};
app = express()
app.get('/', (req, res) => {
res.send('Now using https..');
});
var server = https.createServer(options, app);
server.listen(port, () => {
console.log("server starting on port : " + port)
});
Weitere Informationen https://github.com/sagardere/set-up-SSL-in-nodejs
Ich hatte ein ähnliches Problem damit, dass SSL für einen anderen Port als Port 443 verwendet wurde. In meinem Fall hatte ich ein Bundle-Zertifikat sowie ein Zertifikat und einen Schlüssel. Das Bundle-Zertifikat ist eine Datei, die mehrere Zertifikate enthält. Für den Knoten müssen Sie diese Zertifikate in separate Elemente eines Arrays aufteilen.
var express = require('express');
var https = require('https');
var fs = require('fs');
var options = {
ca: [fs.readFileSync(PATH_TO_BUNDLE_CERT_1), fs.readFileSync(PATH_TO_BUNDLE_CERT_2)],
cert: fs.readFileSync(PATH_TO_CERT),
key: fs.readFileSync(PATH_TO_KEY)
};
app = express()
app.get('/', function(req,res) {
res.send('hello');
});
var server = https.createServer(options, app);
server.listen(8001, function(){
console.log("server running at https://IP_ADDRESS:8001/")
});
In app.js müssen Sie https angeben und den Server entsprechend erstellen. Stellen Sie außerdem sicher, dass der verwendete Port tatsächlich eingehenden Datenverkehr zulässt.
In Sailsjs gibt es zwei Möglichkeiten, alles zu konfigurieren. Zuerst müssen Sie den Konfigurationsordner mit den jeweils separaten Dateien konfigurieren (z. B. hat die Datenbankverbindung, die sich auf Einstellungen bezieht, eine Verbindung innerhalb von connections.js. Zweitens ist das Konfigurieren der Umgebungsbasis-Dateistruktur erforderlich. Jede Umgebungsdatei wird im Ordner config/env
angezeigt, und jede Datei enthält Einstellungen für bestimmte Umgebungen.
Sails sucht zuerst im Ordner config/env und freut sich dann auf config/* .js
Jetzt können Sie ssl in config/local.js
einrichten.
var local = {
port: process.env.PORT || 1337,
environment: process.env.NODE_ENV || 'development'
};
if (process.env.NODE_ENV == 'production') {
local.ssl = {
secureProtocol: 'SSLv23_method',
secureOptions: require('constants').SSL_OP_NO_SSLv3,
ca: require('fs').readFileSync(__dirname + '/path/to/ca.crt','ascii'),
key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key','ascii'),
cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt','ascii')
};
local.port = 443; // This port should be different than your default port
}
module.exports = local;
Alternativ können Sie dies auch in config/env/production.js hinzufügen. (Dieses Snippet zeigt auch den Umgang mit mehreren CARoot-Zertifikaten.)
Oder in production.js
module.exports = {
port: 443,
ssl: {
secureProtocol: 'SSLv23_method',
secureOptions: require('constants').SSL_OP_NO_SSLv3,
ca: [
require('fs').readFileSync(__dirname + '/path/to/AddTrustExternalCARoot.crt', 'ascii'),
require('fs').readFileSync(__dirname + '/path/to/COMODORSAAddTrustCA.crt', 'ascii'),
require('fs').readFileSync(__dirname + '/path/to/COMODORSADomainValidationSecureServerCA.crt', 'ascii')
],
key: require('fs').readFileSync(__dirname + '/path/to/jsbot.key', 'ascii'),
cert: require('fs').readFileSync(__dirname + '/path/to/jsbot.crt', 'ascii')
}
};
Ws is Web Socket und wss stellen Secure Web Socket dar, da wir ssl einrichten, dann werden http und ws beide Anforderungen sicher und wandeln sie in https bzw. wss um.
Es gibt viele Quellen aus unserer App, die eine Anfrage erhalten, wie jeder Blogbeitrag, ein Social-Media-Beitrag. Unser Server wird jedoch nur über https ausgeführt. Wenn eine Anfrage von http kommt, wird der Fehler "Diese Website kann nicht erreicht werden" im Client-Browser angezeigt. Und wir verlieren unseren Websiteverkehr. Daher müssen wir die http-Anfrage an https umleiten. Dieselben Regeln erlauben Websocket, andernfalls schlägt Socket fehl.
Wir müssen also denselben Server auf Port 80 (http) ausführen und alle Anforderungen an Port 443 (https) umleiten. Sails kompilieren zuerst die Datei config/bootstrap.js, bevor der Server angehoben wird. Hier können wir unseren Express-Server an Port 80 starten.
In config/bootstrap.js (http-Server erstellen und alle Anforderungen an https umleiten)
module.exports.bootstrap = function(cb) {
var express = require("express"),
app = express();
app.get('*', function(req, res) {
if (req.isSocket)
return res.redirect('wss://' + req.headers.Host + req.url)
return res.redirect('https://' + req.headers.Host + req.url)
}).listen(80);
cb();
};
Jetzt können Sie http://www.IhreDomain.com besuchen, es wird zu https://www.IhreDomain.com umgeleitet.
So funktioniert es für mich. Die verwendete Umleitung leitet auch alle normalen http-Adressen um.
const express = require('express');
const bodyParser = require('body-parser');
const path = require('path');
const http = require('http');
const app = express();
var request = require('request');
//For https
const https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('certificates/private.key'),
cert: fs.readFileSync('certificates/certificate.crt'),
ca: fs.readFileSync('certificates/ca_bundle.crt')
};
// API file for interacting with MongoDB
const api = require('./server/routes/api');
// Parsers
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
// Angular DIST output folder
app.use(express.static(path.join(__dirname, 'dist')));
// API location
app.use('/api', api);
// Send all other requests to the Angular app
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'dist/index.html'));
});
app.use(function(req,resp,next){
if (req.headers['x-forwarded-proto'] == 'http') {
return resp.redirect(301, 'https://' + req.headers.Host + '/');
} else {
return next();
}
});
http.createServer(app).listen(80)
https.createServer(options, app).listen(443);
Greenlock behandelt das Ausstellen und Erneuern von Zertifikaten (über Let's Encrypt) und http => https-Umleitung, sofort einsatzbereit.
express-app.js
:
var express = require('express');
var app = express();
app.use('/', function (req, res) {
res.send({ msg: "Hello, Encrypted World!" })
});
// DO NOT DO app.listen()
// Instead export your app:
module.exports = app;
server.js
:
require('greenlock-express').create({
// Let's Encrypt v2 is ACME draft 11
version: 'draft-11'
, server: 'https://acme-v02.api.letsencrypt.org/directory'
// You MUST change these to valid email and domains
, email: '[email protected]'
, approveDomains: [ 'example.com', 'www.example.com' ]
, agreeTos: true
, configDir: "/path/to/project/acme/"
, app: require('./express-app.j')
, communityMember: true // Get notified of important updates
, telemetry: true // Contribute telemetry data to the project
}).listen(80, 443);
Sehen Sie sich die QuickStart-Demo an: https://youtu.be/e8vaR4CEZ5s
Beantworten Sie diese Frage nur im Voraus, da es sich um eine häufig gestellte Frage handelt:
Sie können auf localhost keine SSL-Zertifikate haben. Sie können jedoch etwas wie Telebit verwenden, mit dem Sie lokale Apps als echte ausführen können.
Sie können private Domänen mit Greenlock auch über DNS-01-Challenges verwenden, die in README zusammen mit verschiedenen Plugins, die dies unterstützen, erwähnt werden.
Lesen Sie den obigen Hinweis zu localhost - Sie können mit Let's Encrypt auch keine Standardports verwenden.
Sie können jedoch Ihre internen Nicht-Standard-Ports als externe Standardports über Port-Forward, Sni-Route oder über Telebit bereitstellen, das SNI-Routing und Port-Forwarding/Relaying für Sie übernimmt.
Sie können auch DNS-01-Herausforderungen verwenden. In diesem Fall müssen Sie keine Ports freigeben und Domains in privaten Netzwerken auf diese Weise sichern.
Dies ist mein Arbeitscode für Express 4.0 .
express 4.0 unterscheidet sich stark von 3.0 und anderen.
4.0 Sie haben/bin/www-Datei, die Sie hier https hinzufügen werden.
"npm start" ist die Standardmethode, mit der Sie den Express 4.0-Server starten.
die Funktion readFileSync () sollte __ dirname verwenden, um das aktuelle Verzeichnis abzurufen
while require () use ./ bezieht sich auf das aktuelle Verzeichnis.
Zuerst legen Sie private.key und public.cert im Ordner/bin ab. Dies ist derselbe Ordner wie die WWW-Datei .