criar um certificado SSL autoassinado confiável para localhost (para uso com Express / Node)

Tentando seguir várias instruções sobre como criar um certificado auto-assinado para uso com localhost, a maioria das instruções parece ser para o IIS, mas estou tentando usar o Nodejs / Express. Nenhum deles funciona corretamente porque, embora o certificado seja instalado, ele não é confiável. aqui está o que eu tentei que falha:

  • Como posso criar um certificado autoassinado para localhost?
  • https://www.digitalocean.com/community/articles/how-to-create-a-ssl-certificate-on-nginx-for-ubuntu-12-04/
  • http://blogs.developerforce.com/developer-relations/2011/05/generating-valid-self-signed-certificates.html
  • http://www.robbagby.com/iis/self-signed-certificates-on-iis-7-the-easy-way-and-the-most-effective-way/

Alguém pode oferecer um stream de trabalho que pode fazer isso? Eu posso obter um certificado instalado, mas não posso obter o certificado confiável no chrome (v32) ou no IE (v10).

EDIT: foi sugerido nos comentários que o problema não é um certificado de raiz confiável. Eu instalei o certificado via IE, mas ainda não é confiável.

Você pode tentar o openSSL para gerar certificados. Dê uma olhada nisso .

Você precisará de um arquivo .key e .crt para adicionar HTTPS ao nó JS express server. Depois de gerar isso, use esse código para adicionar HTTPS ao servidor.

var https = require('https'); var fs = require('fs'); var express = require('express'); var options = { key: fs.readFileSync('/etc/apache2/ssl/server.key'), cert: fs.readFileSync('/etc/apache2/ssl/server.crt'), requestCert: false, rejectUnauthorized: false }; var app = express(); var server = https.createServer(options, app).listen(3000, function(){ console.log("server started at port 3000"); }); 

Isso está funcionando bem na minha máquina local, bem como no servidor onde implantei isso. O que eu tenho no servidor foi comprado de goDaddy mas localhost tinha um certificado auto-assinado.

No entanto, cada navegador emitiu um erro dizendo que a conexão não é confiável, você deseja continuar. Depois de clicar em continuar, funcionou bem.

Se alguém já ignorou esse erro com certificado auto-assinado, por favor, ilumine.

Caminho mais curto. Testado no MacOS, mas pode funcionar de forma semelhante em outro sistema operacional.

Gere pem

 > openssl req -x509 -newkey rsa:2048 -keyout keytmp.pem -out cert.pem -days 365 > openssl rsa -in keytmp.pem -out key.pem 

Seu servidor expresso

 const express = require('express') const app = express() const https = require('https') const fs = require('fs') const port = 3000 app.get('/', (req, res) => { res.send('WORKING!') }) const httpsOptions = { key: fs.readFileSync('./key.pem'), cert: fs.readFileSync('./cert.pem') } const server = https.createServer(httpsOptions, app).listen(port, () => { console.log('server running at ' + port) }) 
  • Abra https://localhost:3000 no Google Chrome e você verá que não é seguro. Ainda!
  • Em Ferramentas para Desenvolvedores> Segurança> Visualizar Certificado: Arraste a imagem para sua área de trabalho e clique duas vezes nela.
  • Clique em “Adicionar”
  • Encontre-o no Acesso às Chaves e clique duas vezes nele
  • Expanda ‘Confiança’ e altere ‘Ao usar este certificado’ para ‘Sempre confiar’.
  • Você pode ser solicitado a autenticar.
  • Reinicie seu servidor.
  • Atualize seu navegador.
  • Apreciar! 🙂

As respostas acima foram parciais. Eu passei tanto tempo fazendo isso funcionar, é insano. Nota para o meu futuro, aqui está o que você precisa fazer:

Estou trabalhando no Windows 10, com o Chrome 65. O Firefox está se comportando bem – apenas confirme localhost como uma exceção de segurança e ele funcionará. O Chrome não:

Etapa 1. em seu back-end, crie uma pasta chamada security . vamos trabalhar dentro dele.

Etapa 2. crie um arquivo de configuração de solicitação chamado req.cnf com o seguinte conteúdo (o crédito vai para: @Anshul )

req.cnf:

 [req] distinguished_name = req_distinguished_name x509_extensions = v3_req prompt = no [req_distinguished_name] C = Country initials like US, RO, GE ST = State L = Location O = Organization Name OU = Organizational Unit CN = www.localhost.com [v3_req] keyUsage = critical, digitalSignature, keyAgreement extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = www.localhost.com DNS.2 = localhost.com DNS.3 = localhost 

Uma explicação sobre esses campos está aqui .

Etapa 3. navegue até a pasta de segurança no terminal e digite o seguinte comando:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout cert.key -out cert.pem -config req.cnf -sha256

Passo 4. então fora da pasta de security , no seu aplicativo expresso faça algo assim: (crédito vai para @Diego Mello)

 backend /security /server.js 

server.js:

 const express = require('express') const app = express() const https = require('https') const fs = require('fs') const port = 3000 app.get('/', (req, res) => { res.send("IT'S WORKING!") }) const httpsOptions = { key: fs.readFileSync('./security/cert.key'), cert: fs.readFileSync('./security/cert.pem') } const server = https.createServer(httpsOptions, app) .listen(port, () => { console.log('server running at ' + port) }) 

Etapa 5. inicie o servidor, node server.js e vá para https: // localhost: 3000 .

Neste ponto, temos a configuração do servidor. Mas o navegador deve mostrar uma mensagem de aviso.

Precisamos registrar nosso certificado autoassinado, como uma autoridade de certificação confiável da CA, no armazenamento de certificados chrome / windows. (chrome também salva isso no windows,)

Etapa 6. Abra o Dev Tools no chrome, vá para o painel Security e clique em View Certificate. insira a descrição da imagem aqui

Etapa 7. Vá para o painel Detalhes, clique em Copiar Arquivo e, em seguida, quando o Assistente para Exportação de Certificados aparecer, clique em Avançar, conforme abaixo:

vá para detalhes - copiar arquivo - em seguida no assistente de exportação

Passo 8. Deixe a codificação DER, clique em Next, escolha Browse , coloque-a em uma pasta de fácil access como Desktop, e nomeie o certificado localhost.cer, then click Save and then Finish. . Você deve conseguir ver seu certificado no Desktop.

Etapa 9. Abra chrome://settings/ inserindo-o na checkbox de URL. Abaixo, clique em Advanced / Advanced Options e role para baixo para encontrar Manage Certificates .

escolha gerenciar certificados

Etapa 10. Vá para o painel Autoridades de Certificação Raiz Confiáveis ​​e clique em importar.

Vá para o painel Autoridades de Certificação Raiz Confiáveis ​​e clique em importar

Vamos importar o certificado localhost.cer que acabamos de exportar na etapa 8.

Passo 11. clique em procurar, localize o localhost.cer , deixe os valores padrão, clique em próximo um monte de vezes – até que este aviso apareça, clique em sim.

confirmar exceção de segurança

Etapa 12. Feche tudo e reinicie o Chrome. Então, ao ir para https://localhost:3000 você deverá ver: Tem que amar o verde

Como gerar um certificado SSL para localhost: link

 openssl genrsa -des3 -out server.key 1024 

você precisa digitar uma senha aqui que você precisa digitar novamente nas etapas a seguir

 openssl req -new -key server.key -out server.csr 

quando perguntado “Common Name” digite: localhost

 openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt 

Aqui está o que está funcionando para mim

no windows

1) Adicione isso ao seu arquivo% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net (causa navegador tem problemas com ‘localhost’ (para script de origem cruzada)

O Windows Vista e o Windows 7 Vista e o Windows 7 usam o Controle de Conta de Usuário (UAC) para que o Bloco de Notas seja executado como Administrador.

  1. Clique em Iniciar -> Todos os Programas -> Acessórios

  2. Clique com o botão direito no Bloco de notas e selecione Executar como administrador

  3. Clique em Continuar na janela do UAC “Windows needs your permission”.

  4. Quando o Bloco de Notas é aberto Clique em Arquivo -> Abrir

  5. No campo do nome do arquivo, digite C: \ Windows \ System32 \ Drivers \ etc \ hosts

  6. Clique em Abrir

  7. Adicione isto ao seu arquivo% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net

  8. Salve 

  9. Feche e reinicie os navegadores

No Mac ou Linux:

  1. Abra / etc / hosts com permissão su
  2. Adicione 127.0.0.1 localdev.YOURSITE.net
  3. Salve isso

Ao desenvolver, você usa localdev.YOURSITE.net em vez de localhost, portanto, se estiver usando configurações run / debug no seu ide, certifique-se de atualizá-lo.

Use “.YOURSITE.net” como cookiedomain (com um ponto no começo) ao criar o cookiem, então ele deve funcionar com todos os subdomínios.

2) crie o certificado usando esse localdev.url

DICA: Se você tiver problemas ao gerar certificados no Windows, use uma máquina VirtualBox ou Vmware.

3) importe o certificado conforme descrito em http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

Se você estiver usando o nó, por que não gerá-los com o nó? Este módulo parece ser bastante completo:

Note que eu não iria gerar na mosca. Gere com algum tipo de script de construção para ter um certificado e uma chave consistentes. Caso contrário, você terá que autorizar o certificado auto-assinado recém-gerado todas as vezes.

Se você estiver no OSX / Chrome, poderá adicionar o certificado SSL autoassinado ao conjunto de chaves do sistema, conforme explicado aqui: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and -significados-ssl-certificados

É um processo manual, mas finalmente consegui que funcione. Apenas certifique-se de que o Nome Comum (CN) esteja definido como “localhost” (sem a porta) e depois que o certificado for adicionado, certifique-se de que todas as opções de Confiança do certificado estejam definidas como “Sempre Confiável”. Além disso, certifique-se de adicioná-lo ao keychain “System” e não ao keychain “login”.

no windows eu fiz o certificado de desenvolvimento iis confiável usando MMC (start> run> mmc), então adicione o snapin de certificado, escolhendo “local computer” e aceitando os padrões. Depois que o snapip do certificado for adicionado, expanda a tree de certificados do computador local para procurar em Personal, selecione o certificado de host local, clique com o botão direito> all task> export. aceita todos os padrões no assistente de exportação.

Depois que o arquivo for salvo, expanda certificados confiáveis ​​e comece a importar o certificado que você acabou de exportar. https://localhost agora é confiável no chrome sem avisos de segurança.

Eu usei este guia de resolução # 2 do blog do MSDN, o op também compartilhou um link em sua pergunta sobre isso também deve usar o MMC, mas isso funcionou para mim. resolução # 2

Existem mais aspectos para isso.

Você pode conseguir TLS (alguns continuam dizendo SSL) com um certificado, auto-assinado ou não.

Para ter uma barra verde para um certificado auto-assinado, você também precisa se tornar a Autoridade de Certificação (CA). Esse aspecto está faltando na maioria dos resources que encontrei em minha jornada para alcançar a barra verde em minha configuração de desenvolvimento local. Tornar-se uma CA é tão fácil quanto criar um certificado.

Este recurso abrange a criação do certificado de autoridade de certificação e de um certificado de servidor e resultou em minha configuração para mostrar uma barra verde no localhost Chrome, Firefox e Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Vá para: chrome://flags/

Ativar: permite certificados inválidos para resources carregados do host local.

Você não tem a segurança verde, mas sempre é permitido https: // localhost no chrome.

Algumas das respostas postadas têm peças que foram muito úteis para superar esse problema também. No entanto, eu também estava interessado no número mínimo de etapas e, idealmente, evitando o OpenSSL (no Windows 10).

Portanto, uma parte essencial das respostas (credit: @ TroyWorks ) é que você precisa editar seu arquivo HOSTS para criar um servidor fictício e mapeá-lo para 127.0.0.1. Isso pressupõe que você estará fazendo desenvolvimento local.

No meu caso, eu estava usando o certificado SS para proteger um websocket no NodeJS, e esse socket estava sendo conectado ao programaticamente (ao contrário do navegador). Então, para mim, era fundamental que o certificado fosse aceito sem avisos ou erros, e a peça fundamental que havia para obter o certificado criado com um CN apropriado (e, é claro, aceitar o certificado em Autoridades Confiáveis, como descrito em outras partes nas respostas) . Usar o IIS para criar um certificado autoassinado não criará o CN adequado, então descobri o seguinte comando simples usando o Powershell:

 New-SelfSignedCertificate -DnsName "gandalf.dummy.dev" -FriendlyName "gandalf" -CertStoreLocation "cert:\LocalMachine\My" 

Isso deve ser executado no console de administração do PS, mas ele simplesmente funciona e coloca o certificado na seção “Pessoal” do armazenamento de certificados LocalMachine. Você pode verificar se foi criado executando:

 ls cert:\LocalMachine\My 

Para confiar, simplesmente copie e cole em “Autoridades de Certificação Raiz Confiáveis” usando o Gerenciador de Certificados (certificando-se de que você está vendo os certificados da Máquina Local, não o Usuário Atual!).

Se você se vincular a esse certificado no IIS, poderá acessar https://gandalf.dummy.dev/ e obter uma conexão segura sem nenhum aviso.

A parte final, usando isso no NodeJS, é descrita acima e em outras respostas de SO, portanto, apenas adicionarei que, no Windows, é mais fácil trabalhar com um arquivo pfx que combine o certificado e a chave privada. Você pode exportar um pfx facilmente do Gerenciador de Certificados, mas isso afeta como você o usa no NodeJS. Ao instanciar um servidor usando o módulo ‘https’, as opções que você usaria (em vez de ‘key’ e ‘cert’) seriam ‘pfx’ e ‘passphrase’, como em:

 var https = require('https'); var options = { pfx: fs.readFileSync('mypfxfile'), passphrase: 'foo' }; var server = https.createServer(options);