Como criar um servidor HTTPS no Node.js?

360

Dada uma chave e um certificado SSL, como se cria um serviço HTTPS?

murvinlai
fonte
2
Usei restify.js em vez de express.js, mas a ideia é a mesma. Aqui está como eu configurar um servidor node.js que aceita HTTP e HTTPS qugstart.com/blog/node-js/...
awaage
2
sem a expressa e com a versão mais recente do nó - olhada aqui: stackoverflow.com/a/21809393/388026
pkyeck
11
O que aconteceu com essa pergunta? As respostas sugerem que era originalmente sobre o express.js.
Doug65536 04/04
é trivial para criar um certificado SSL válido, auto-assinado e lançar um servidor HTTPS, apenas a alguns passos
Lloyd
3
É um pouco tarde, mas se alguém precisa de uma completa nodejs https tutorial, pode encontrar aqui: programmerblog.net/nodejs-https-server
Jason W

Respostas:

150

Eu encontrei o seguinte exemplo.

https://web.archive.org/web/20120203022122/http://www.silassewell.com/blog/2010/06/03/node-js-https-ssl-server-example/

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);
hvgotcodes
fonte
3
setSecureestá obsoleto. Em vez disso, stackoverflow.com/questions/5136353/node-js-https-secure-error
Larry Battle
7
Veja a resposta oficial oficial abaixo por @Jacob Marble.
precisa saber é o seguinte
21
Este exemplo não funciona mais, pois a implementação HTTPS foi refeita no Node.JS 0.4. Veja os documentos correspondentes em nodejs.org. stackoverflow.com/questions/5136353/...
scottyab
11
Esta resposta é muito antiga e não funciona mais. Por favor, veja a resposta por pkyeck abaixo, ou visite: nodejs.org/api/https.html
Jay Sheth
2
Também o link está quebrado
TlonXP 10/11/14
484

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);
Jacob Marble
fonte
49
Bom, estava prestes a publicar isso sozinho. Obrigado. Além disso, achei este artigo útil para gerar um certificado autoassinado.
precisa saber é o seguinte
11
Certifique-se de colocar optionsprimeiro https.createServer, para evitar erros enigmáticos.
26513 wberry
11
Estou configurando uma porta 8888 do servidor https quase idêntica e não sei como alterar as rotas. quando executo curl curl - localhost seguro : 8888 curl: (35) Erro desconhecido no protocolo SSL em conexão com o localhost: 8888 de que erro vem e como contorná-lo. Quando digito localhost: 8888 no navegador, ele trava e https: / localhost: 8888 fornece erro SSL
reza 25/10
2
@Costa você pode redirecionar os usuários de http para https com expressa-force-SSL ou a mão middleware escrita - é bastante simples
floatdrop
11
@NathanMcKaskle Você pode desativar a senha: Verifique este guia, mas se você estiver usando o macOS, verifique se o comprimento da chave gerada é pelo menos 2048:openssl genrsa -out key.pem 2048
sakisk
87

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);
pkyeck
fonte
Funcionou como um encanto. Essas informações foram muito úteis, pois eu executo uma ferramenta node.js (PDFJS) em cima de um aplicativo PHP que foi recentemente forçado a executar sobre https. O iframe ficou muito infeliz ao carregar meu aplicativo node.js em uma porta alternativa não https.
Lewsid 7/10
2
Parece bom, mas como posso gerar os arquivos necessários lá ( *.pem)? Tentei seguir esta página , mas ao abrir localhost:8000no navegador, nenhum dado é recebido (apenas carregando ...).
Bizonic
7
@ IonicăBizău, para a geração de chaves, instalação openssl, em seguida, em cmd prompt, digiteopenssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3001
mido
2
@ IonicăBizău você precisa ir diretamente para https://localhost:8080. HTTP NÃO é HTTPS.
Florian Wendelborn
É possível criar um servidor https com pasta? Então você pode colocar o arquivo nele e acessá-lo como localhost: 81 / main.js
FrenkyB 20/19/19
47

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});
nu1silva
fonte
Isso é tecnicamente a resposta mais correta, uma vez que a questão era como fazê-lo com Express.js
Kato
12
Este parece ser obsoleto desde "aplicações não herdar de http.Server"
Merlyn Morgan-Graham
2
Por que você está configurando module.exports? Não há necessidade disso
Matej 11/11
11
@matejkramny, provavelmente porque facilita o teste.
Justin
21

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);
John Slegers
fonte
18

Atualizar

Use o Let's Encrypt via Greenlock.js

Correio Original

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 serverinstância para alguma função inicializadora que cria o aplicativo connect / express (se você deseja fazer websockets sobre SSL no mesmo servidor, por exemplo).

CoolAJ86
fonte
Esta é uma explicação bom, mas, no link fornecido na seção de atualização, é quebrada (dá erro 500)
Chucky
8

Para permitir que seu aplicativo escute ambas httpe httpsnas portas 80e 443respectivamente, 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

cmd
fonte
0

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.certpara criar os arquivos, se você precisar escrever testes)

Manuel Spigolon
fonte
-4
  1. Faça o download do arquivo rar para o openssl configurado aqui: https://indy.fulgan.com/SSL/openssl-0.9.8r-i386-win32-rev2.zip
  2. Basta copiar sua pasta na unidade c.
  3. Crie o arquivo openssl.cnf e faça o download do conteúdo em: http://web.mit.edu/crypto/openssl.cnf openssl.cnf pode ser colocado em qualquer lugar, mas o caminho deve estar correto quando for solicitado no prompt de comando.
  4. Abra o comando propmt e defina o caminho openssl.cnf C: \ set OPENSSL_CONF = d: /openssl.cnf 5. Execute isso no cmd: C: \ openssl-0.9.8r-i386-win32-rev2> openssl.exe
  5. Em seguida, execute o OpenSSL> genrsa -des3 -out server.enc.key 1024
  6. Em seguida, ele solicitará frases secretas: digite 4 a 11 caracteres como sua senha para o certificado
  7. Em seguida, execute o arquivo Openssl> req -new -key server.enc.key -out server.csr
  8. Em seguida, solicitará alguns detalhes, como o nome do estado do código do país, etc. preencha-o livremente. 10) Em seguida, execute Openssl> rsa -in server.enc.key -out server.key
  9. Execute este OpenSSL> x509 -req -days 365 -in server.csr -signkey server.key -out server.crt e use o código anterior que está no estouro da pilha
Er Shubham Patidar
fonte
11
isso é OT . A pergunta do OP é clara. Certificados já são fornecidos.
Martin Schneider