In diesen Beitrag zeige ich euch die nötigen Schritte, wie ihr einen HTTPS Server mit Node.js und OpenSSL erstellen könnt. HTTPS ist ein Protokoll welches eine verschlüsselte Verbindung zwischen Client und Server zur Verfügung stellt.
Zuerst benötigt ihr Node.js und die neuste Version von OpenSSL. Diese könnt ihr hier runterladen: https://nodejs.org/ja und https://www.openssl.org/.
Dann erstellt ihr euch ein Verzeichnis welches aus einer Javascript Datei besteht, z.B. server.js und ein Unterverzeichnis genannt certificiates. In diesen Unterverzeichnis kommen die Schlüssel und das signierte Zertifikat rein.
Öffnet euer Terminal oder Powershell und gebt folgende Befehle nacheinander ein:
openssl genrsa -out key.pem 2048
Damit generiert ihr euch ein 2048-bit RSA Schlüsselpaar und extrahiert den private key des Servers.
openssl req -new -key key.pem -out csr.pem
Damit wird eine Zertifikatsanfragedatei erstellt. Hier werdet ihr aufgefordert sämtliche Informationen über euch oder euer Unternhemen anzugeben. Die Eingabe erfolgt im Terminal. Diese Datei muss signiert werden. Entweder von einer Zertifizierungsstelle für den produktiven gebrauch, oder ihr signiert euer Zertifikat selber während der Entwicklung.
openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out cert.pem
Mit diesen Befehl signieren wir unser Zertifikat selber und es soll eine Gültigkeit von 365 Tagen haben.
Da das erstellte Zertifikat von uns selber signiert wurde, zeigen die Browser eine Sicherheitswarnung an, dass das Zertifikat ungültig ist. Die Verbindung sollte durch euren Browser blockiert werden.
Entweder man lässt sich so ein Zertifikat von einer Zertifizierungsstelle signieren damit es eine Gültigkeit hat, oder man geht in die Browsereinstellung und lässt für localhost eine Ausnahme zu.
Warnung vom Browser
Unser Zertifikat
Für Chrome gibt man in der Suchleiste chrome://flags
ein und erlaubt Allow invalid certificates for resources loaded from localhost
.
Die Dateien key.pem und cert.pem werden in das certificates Ordner kopiert. Anschließend startet ihr euren Node.js Server. Nun habt ihr einen HTTPS Server welchen ihr entsprechend mit Events erweitern könnt.
const express = require('express');
const https = require('https');
const cors = require('cors');
const fs = require('fs');
const { Server } = require('socket.io');
const app = express();
app.use(cors());
/**
* create a HTTPS server with certificates created with openssl
*/
const sslServer = https.createServer({
key: fs.readFileSync('./certificates/key.pem','utf-8'),
cert: fs.readFileSync('./certificates/cert.pem','utf-8')
}, app);
const io = new Server(sslServer, {
cors: {
origin: 'http://localhost:3000',
methods: ['GET','POST']
}
});
/**
* events during a TCP connection
*/
io.on('connection', (socket) => {
console.log(`User connected: ${socket.id}`);
socket.on('receive_something', (data) => {
socket.emit('some_response_event', 'some data for the client');
});
});
sslServer.listen(3001, () => {
console.log('Listening to Port 3001');
});