Dada uma chave e um certificado SSL, como se cria um serviço HTTPS?
Dada uma chave e um certificado SSL, como se cria um serviço HTTPS?
Respostas:
Eu encontrei o seguinte exemplo.
Isso funciona para o nó v0.1.94 - v0.3.1. server.setSecure()
é removido nas versões mais recentes do nó.
Diretamente dessa fonte:
const crypto = require('crypto'),
fs = require("fs"),
http = require("http");
var privateKey = fs.readFileSync('privatekey.pem').toString();
var certificate = fs.readFileSync('certificate.pem').toString();
var credentials = crypto.createCredentials({key: privateKey, cert: certificate});
var handler = function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
};
var server = http.createServer();
server.setSecure(credentials);
server.addListener("request", handler);
server.listen(8000);
setSecure
está obsoleto. Em vez disso, stackoverflow.com/questions/5136353/node-js-https-secure-error
O documento da API Express explica isso claramente.
Além disso, esta resposta fornece as etapas para criar um certificado autoassinado.
Eu adicionei alguns comentários e um trecho do Node.js HTTPS documentação :
var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');
// This line is from the Node.js HTTPS documentation.
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.cert')
};
// Create a service (the app object is just a callback).
var app = express();
// Create an HTTP service.
http.createServer(app).listen(80);
// Create an HTTPS service identical to the HTTP service.
https.createServer(options, app).listen(443);
options
primeiro https.createServer
, para evitar erros enigmáticos.
Encontrei essa pergunta ao pesquisar no "nó https", mas o exemplo na resposta aceita é muito antigo - extraído dos documentos da versão atual (v0.10) do nó, ele deve se parecer com o seguinte:
var https = require('https');
var fs = require('fs');
var options = {
key: fs.readFileSync('test/fixtures/keys/agent2-key.pem'),
cert: fs.readFileSync('test/fixtures/keys/agent2-cert.pem')
};
https.createServer(options, function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}).listen(8000);
*.pem
)? Tentei seguir esta página , mas ao abrir localhost:8000
no navegador, nenhum dado é recebido (apenas carregando ...).
openssl
, em seguida, em cmd prompt, digiteopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
https://localhost:8080
. HTTP NÃO é HTTPS.
As respostas acima são boas, mas com o Express e o nó isso funcionará bem.
Como o Express cria o aplicativo para você, eu vou pular isso aqui.
var express = require('express')
, fs = require('fs')
, routes = require('./routes');
var privateKey = fs.readFileSync('cert/key.pem').toString();
var certificate = fs.readFileSync('cert/certificate.pem').toString();
// To enable HTTPS
var app = module.exports = express.createServer({key: privateKey, cert: certificate});
module.exports
? Não há necessidade disso
A configuração mínima para um servidor HTTPS no Node.js seria algo como isto:
var https = require('https');
var fs = require('fs');
var httpsOptions = {
key: fs.readFileSync('path/to/server-key.pem'),
cert: fs.readFileSync('path/to/server-crt.pem')
};
var app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
https.createServer(httpsOptions, app).listen(4433);
Se você também deseja dar suporte a solicitações http, é necessário fazer apenas esta pequena modificação:
var http = require('http');
var https = require('https');
var fs = require('fs');
var httpsOptions = {
key: fs.readFileSync('path/to/server-key.pem'),
cert: fs.readFileSync('path/to/server-crt.pem')
};
var app = function (req, res) {
res.writeHead(200);
res.end("hello world\n");
}
http.createServer(app).listen(8888);
https.createServer(httpsOptions, app).listen(4433);
Use o Let's Encrypt via Greenlock.js
Percebi que nenhuma dessas respostas mostra que, ao adicionar uma CA raiz intermediária à cadeia, aqui estão alguns exemplos de configuração zero para brincar:
Snippet:
var options = {
// this is the private key only
key: fs.readFileSync(path.join('certs', 'my-server.key.pem'))
// this must be the fullchain (cert + intermediates)
, cert: fs.readFileSync(path.join('certs', 'my-server.crt.pem'))
// this stuff is generally only for peer certificates
//, ca: [ fs.readFileSync(path.join('certs', 'my-root-ca.crt.pem'))]
//, requestCert: false
};
var server = https.createServer(options);
var app = require('./my-express-or-connect-app').create(server);
server.on('request', app);
server.listen(443, function () {
console.log("Listening on " + server.address().address + ":" + server.address().port);
});
var insecureServer = http.createServer();
server.listen(80, function () {
console.log("Listening on " + server.address().address + ":" + server.address().port);
});
Essa é uma das coisas que geralmente é mais fácil se você não tentar fazê-lo diretamente por meio de conexão ou expressão, mas deixe o nativohttps
módulo lidar com isso e use-o para atendê-lo ao aplicativo connect / express.
Além disso, se você usar, em server.on('request', app)
vez de passar o aplicativo ao criar o servidor, você terá a oportunidade de passar a server
instância para alguma função inicializadora que cria o aplicativo connect / express (se você deseja fazer websockets sobre SSL no mesmo servidor, por exemplo).
Para permitir que seu aplicativo escute ambas http
e https
nas portas 80
e 443
respectivamente, faça o seguinte
Crie um aplicativo expresso:
var express = require('express');
var app = express();
O aplicativo retornado por express()
é uma função JavaScript. Pode ser passado para os servidores HTTP do Node como um retorno de chamada para manipular solicitações. Isso facilita o fornecimento das versões HTTP e HTTPS do seu aplicativo usando a mesma base de código.
Você pode fazer o seguinte:
var express = require('express');
var https = require('https');
var http = require('http');
var fs = require('fs');
var app = express();
var options = {
key: fs.readFileSync('/path/to/key.pem'),
cert: fs.readFileSync('/path/to/cert.pem')
};
http.createServer(app).listen(80);
https.createServer(options, app).listen(443);
Para detalhes completos, consulte o documento
Você também pode usar isso para arquivar isso com a estrutura Fastify:
const { readFileSync } = require('fs')
const Fastify = require('fastify')
const fastify = Fastify({
https: {
key: readFileSync('./test/asset/server.key'),
cert: readFileSync('./test/asset/server.cert')
},
logger: { level: 'debug' }
})
fastify.listen(8080)
(e execute openssl req -nodes -new -x509 -keyout server.key -out server.cert
para criar os arquivos, se você precisar escrever testes)