How to use HTTPS on Node.js using Express/Socket.io
It is hard to test your example without your key and cert files instead I am going to provide an example where I am using Express, socket.io, and https.
First I will create the key and cert files, so inside a directory run the following commands from your terminal:
The command below it is going to generate a file containing an RSA key.
$ openssl genrsa 1024 > file.pem
Here you will be asked to input data but you can leave blank pressing enter until the crs.pem is generated.
$ openssl req -new -key file.pem -out csr.pem
Then a file.crt file will be created containing an SSL certificate.
$ openssl x509 -req -days 365 -in csr.pem -signkey file.pem -out file.crt
So in my app.js
file where I am setting and starting the server notice that I am using the files file.pem
and file.crt
generated in the last step:
var fs = require('fs');var https = require('https');var express = require('express');var app = express();var options = { key: fs.readFileSync('./file.pem'), cert: fs.readFileSync('./file.crt')};var serverPort = 443;var server = https.createServer(options, app);var io = require('socket.io')(server);app.get('/', function(req, res) { res.sendFile(__dirname + '/public/index.html');});io.on('connection', function(socket) { console.log('new connection'); socket.emit('message', 'This is a message from the dark side.');});server.listen(serverPort, function() { console.log('server up and running at %s port', serverPort);});
and then my public/index.html
where I am consuming the server:
<!doctype html><html> <head> </head> <body> <h1>I am alive!!</h1> <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.js"></script> <script> var URL_SERVER = 'https://localhost:443'; var socket = io.connect(URL_SERVER); socket.on('message', function(data) { alert(data); }); </script> </body></html>
then finally if you access from the browser at https://localhost
, you will see an alert with a message that is coming from the websocket server.
This is how I managed to set it up with express:
var fs = require( 'fs' );var app = require('express')();var https = require('https');var server = https.createServer({ key: fs.readFileSync('./test_key.key'), cert: fs.readFileSync('./test_cert.crt'), ca: fs.readFileSync('./test_ca.crt'), requestCert: false, rejectUnauthorized: false},app);server.listen(8080);var io = require('socket.io').listen(server);io.sockets.on('connection',function (socket) { ...});app.get("/", function(request, response){ ...})
I hope that this will save someone's time.