crie um certificado SSL autoassinado confiável para host local (para uso com Express / Node)

130

Tentando seguir várias instruções sobre como criar um certificado autoassinado para uso com o host local, 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:

Alguém pode oferecer um fluxo de trabalho que possa fazer isso? Posso instalar um certificado, mas não posso confiar no certificado no chrome (v32) ou no IE (v10).

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

JasonS
fonte
Nenhum dos certificados autoassinados pode ser confiável para navegadores da web. Eles não são assinados por autoridades de assinatura confiáveis.
1
isso não é verdade: você pode instalar um certificado raiz para obter sua certificação autoassinada. no entanto, parece que não consigo fazer isso corretamente. Eu li que você pode instalar a cadeia de certificados no IE (não no chrome), então tentei isso, mas ainda não está sendo reconhecido. Não sei se é porque o host local é especial ou se o certificado autoassinado não está correto.
jasons
3
Eu nunca recebi um certificado autoassinado trabalhando com navegadores como o Chrome. Aqui está minha solução alternativa: Criei uma entrada DNS para local.MYDOMAIN.com apontando para 127.0.0.1 (localhost) e, em seguida, basta usar meu certificado de produção. Isso tem o benefício adicional de garantir que não haja problemas com sua cadeia de certificados de produção etc.
JasonS 12/07/16

Respostas:

86

As respostas acima foram parciais. Passei tanto tempo fazendo isso funcionar, é insano. Observe o meu futuro eu, aqui está o que você precisa fazer:

Estou trabalhando no Windows 10, com o Chrome 65. O Firefox está se comportando bem - basta confirmar o host local como uma exceção de segurança e ele funcionará. O Chrome não:

Etapa 1. No seu back-end, crie uma pasta chamada security. nós trabalharemos dentro dele.

Etapa 2. crie um arquivo de configuração de solicitação nomeado req.cnfcom 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 para 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

Etapa 4. Em seguida, fora da securitypasta, no seu aplicativo expresso, faça algo assim: (o 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.jse 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. (o Chrome também salva isso no Windows)

Etapa 6. abra o Dev Tools no chrome, acesse 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, quando o Assistente para Exportação de Certificados aparecer, clique em Avançar, como abaixo:

vá para detalhes - copiar arquivo - próximo no assistente de exportação

Etapa 8. deixe a codificação DER, clique em Avançar, escolha Browse, coloque-a em uma pasta de fácil acesso, como a Desktop, e dê um nome ao certificado localhost.cer, then click Save and then Finish.. Você poderá ver seu certificado na área de trabalho.

Etapa 9. Abra chrome://settings/inserindo-o na caixa de URL. Abaixo, clique em Advanced / Advanced Optionse 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

Importaremos o localhost.cercertificado que acabamos de exportar na etapa 8.

Etapa 11. clique em procurar, localize localhost.cer, deixe os valores padrão clique em um próximo conjunto de vezes - até esse aviso aparecer, clique em sim.

confirmar exceção de segurança

Etapa 12. feche tudo e reinicie o chrome. Então, ao ir para https://localhost:3000você deve ver: tenho que amar o verde

AIon
fonte
Olá, quando termino todas as etapas que abro https://localhost:3000e o Chrome fica parado no carregamento. Alguém pode dizer qual pode ser o motivo?
co.zohar
@ co.zohar alguma mensagem no console? Pressione crl+shift+iou F12para abrir o console.
Aion
1
Se você está fazendo isso para um endereço em uma rede descobri que a configuração do DNS certificado para um nome de host, tais como: DNS.1 = server.local Então sobre a actualização máquina ligando o arquivo HOSTS para apontar o endereço IP do servidor para o nome do host, por exemplo: 192.168.0.50 server.localEsta vontade permita que o certificado e o endereço correspondam e valide o certificado.
Roskelld 5/10
@AIon o console não mostra nada. A página apenas mostra: "Aguardando localhost ...". Você configurou alguma coisa no arquivo hosts?
co.zohar
1
Encontrei uma semi-resposta para minha própria pergunta: se você alterar CN e DNS.1 para algo como "local.com", por exemplo, e em cada computador que precisar de acesso ao servidor, altere o arquivo etc / hosts para apontar para local .com para o ip do servidor, isso funciona.
TKoL
110

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

Gerar 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:3000no Google Chrome e você verá que não é seguro. Ainda!
  • Em Ferramentas do desenvolvedor> Segurança> Exibir certificado: arraste a imagem para a área de trabalho e clique duas vezes nela.
  • Clique em 'Adicionar'
  • Encontre-o no Keychain Access e clique duas vezes nele
  • Expanda 'Confiar' e altere 'Ao usar este certificado' para 'Confiar sempre'.
  • Você pode ser solicitado a se autenticar.
  • Reinicie seu servidor.
  • Atualize seu navegador.
  • Aproveitar! :)
Diego Mello
fonte
1
Aqui está outro link, se você quiser fazê-lo no Mac: certsimple.com/blog/localhost-ssl-fix .
John
Lindo! Isso funcionou! Gostaria de acrescentar: Instale o OpenSSL a partir daqui: indy.fulgan.com/SSL/?C=M;O=A . Obtenha o arquivo .cnf aqui: e, em seguida, configure-o aqui: gist.githubusercontent.com/pandurang90/dbe6a67339747ef5bacf/raw/… e configure o openSSL aqui: stackoverflow.com/questions/7360602/…
Jose A
2
Gostaria de adicionar que, para o Chrome 58 ou superior, você receberá o erro "Nome alternativo do assunto ausente". stackoverflow.com/a/42917227/1057052 . Verifique as respostas abaixo para obter mais ajuda: stackoverflow.com/a/43666288/1057052 , stackoverflow.com/a/44398368/1057052
Jose A
14
Drag image to your desktop and double click it-> não consigo arrastar nada para a minha área de trabalho, não é arrastável .. Do que imagevocê está falando exatamente de minério?
Aion
7
Para superar o "Nome alternativo do assunto ausente" no Chrome, você pode fazer isso em openssl req -newkey rsa:2048 -x509 -nodes -keyout keytmp.pem -new -out cert.pem -subj /CN=localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf '[SAN]\nsubjectAltName=DNS:localhost')) -sha256 -days 3650vez da primeira linha sugerida. E também este irá pedir menos perguntas no processo ...
Michael Litvin
78

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

Você precisará de um arquivo .key e .crt para adicionar HTTPS ao servidor JS Express do nó. Depois de gerar isso, use este 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 em minha máquina local e no servidor em que eu implantei isso. O que eu tenho no servidor foi comprado do goDaddy, mas o localhost tinha um certificado autoassinado.

No entanto, todo navegador gerou um erro dizendo que a conexão não é confiável. Deseja continuar. Depois de clicar em continuar, funcionou bem.

Se alguém já contornou esse erro com certificado autoassinado, informe-o.

Mars Robertson
fonte
9
Seu certificado ainda não é confiável, então você tem o mesmo problema que estou descrevendo. Eu preciso que ele seja confiável para testar / depurar um serviço da web corretamente.
jasons
1
Então você quer que este certificado seja confiável apenas na sua máquina local e não na rede?
1
o link na parte superior da resposta recomenda a criptografia 3DES de 1024 bits, que está desatualizada. Melhor usar openssl genrsa -out key.pem 2048para uma chave melhor.
steampowered
3
Seu certificado ainda não é confiável.
Diego Mello
2
o código expresso acima funciona, utilizando github.com/FiloSottile/mkcert (em vez de openSSL) para criar um certificado CA / confiável local. Barras verdes por todo o caminho.
som
11

Como gerar um certificado SSL para localhost: link

openssl genrsa -des3 -out server.key 1024

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

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

quando perguntado "Nome comum", digite: localhost

openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt
fuma
fonte
1
Esta é a solução que vasculhou a Internet nas últimas 2 horas. Para qualquer pessoa no ubuntu, mova cp server.crt /usr/local/share/ca-certificates/.e execute As sudo update-ca-certificatessolicitações https do host local funcionam no NodeJS 8+. Id também aumentar1024 to 2048
Salyangoz
6

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 (o navegador causa problemas com 'localhost' (para scripts de origem cruzada)

O Windows Vista e o Windows 7 O Vista e o Windows 7 usam o Controle de Conta de Usuário (UAC), portanto o Bloco de Notas deve ser executado como Administrador.

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

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

  3. Clique em Continuar na janela do UAC "O Windows precisa de sua permissão".

  4. Quando o Bloco de notas abrir, clique em Arquivo -> Abrir

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

  6. Clique em Abrir

  7. Adicione isso 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 supermissão
  2. Adicionar 127.0.0.1 localdev.YOURSITE.net
  3. Salve isso

Ao desenvolver, use localdev.YOURSITE.net em vez de localhost; portanto, se você estiver usando configurações de execução / depuração em seu ide, certifique-se de atualizá-lo.

Use ".YOURSITE.net" como domínio de culinária (com um ponto no início) ao criar o ambiente de cozinha; ele deverá funcionar com todos os subdomínios.

2) crie o certificado usando esse localdev.url

DICA: Se você tiver problemas para 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/

TroyWorks
fonte
Oi Troy, obrigado por compartilhar isso. Alguém terá que comentar se isso funciona ou não. Minha solução alternativa: acabei adicionando dev.phantomjscloud.com ao meu arquivo hosts e, em seguida, usando meu certificado de produção. Isso só é útil se você quer suas chaves de produção disponível na sua caixa de dev, então eu acho que sua solução poderia ainda ser válido, se alguém pode agradar a verificar
jasons
Funciona para mim e minha equipe, de várias maneiras, para proteger o servidor local para local para proteger o servidor local para produção.
TroyWorks
Para Windows, o console git bash funciona muito bem usando os comandos openssl daqui . Basta instalar o certificado raiz e você pode criar vários certificados específicos do site assinados por ele, se desejar.
Jason Goemaat
6

Mkcert de @FiloSottile torna este processo infinitamente mais simples:

  1. Instale o mkcert , há instruções para o macOS / Windows / Linux
  2. mkcert -install criar uma autoridade de certificação local
  3. mkcert localhost 127.0.0.1 ::1 criar um certificado confiável para localhost no diretório atual
  4. Você está usando o nó (que não usa o armazenamento raiz do sistema), portanto, você precisa especificar a CA explicitamente em uma variável de ambiente, por exemplo:export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"
  5. Finalmente, execute seu servidor expresso usando a configuração descrita em várias outras respostas (por exemplo, abaixo)
  6. estrondo. localhost está nadando em verde.

Configuração básica do nó:

const https = require('https');
const fs = require('fs');
const express = require('express');

const app = express();    
const server = https.createServer({
    key: fs.readFileSync('/XXX/localhost+2-key.pem'), // where's me key?
    cert: fs.readFileSync('/XXX/localhost+2.pem'), // where's me cert?
    requestCert: false,
    rejectUnauthorized: false,
}, app).listen(10443); // get creative
som
fonte
Funciona muito! Com essa abordagem, não precisamos registrar nosso certificado autoassinado, como uma Autoridade de Certificação confiável da CA, no armazenamento de certificados chrome / windows. Como mencionado em outras respostas.
Zaheer
4

Se você usa o OSX / Chrome, pode adicionar o certificado SSL autoassinado ao chaveiro do sistema, conforme explicado aqui: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and -self-assinado-ssl-certificados

É um processo manual, mas finalmente consegui. Apenas verifique se o Nome Comum (CN) está definido como "localhost" (sem a porta) e após a adição do certificado, verifique se todas as opções de Confiança no certificado estão definidas como "Sempre Confie". Além disso, certifique-se de adicioná-lo ao chaveiro "Sistema" e não ao chaveiro "login".

Vijay Rudraraju
fonte
Ele menciona o IE, o que significa que ele está usando o Windows.
2
3

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

Observe que eu não geraria em tempo real. Gere com algum tipo de script de construção para ter um certificado e uma chave consistentes. Caso contrário, você precisará autorizar o certificado autoassinado recém-gerado todas as vezes.

BT
fonte
3

Algumas das respostas postadas têm partes que foram muito úteis para eu 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 crítica das respostas (crédito: @ 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ê fará desenvolvimento local.

No meu caso, eu estava usando o certificado SS para proteger um soquete da Web no NodeJS, e esse soquete estava sendo conectado programaticamente (ao contrário do navegador). Então, para mim, era fundamental que o certificado fosse aceito sem avisos ou erros, e a parte crítica que havia para obter o certificado criado com uma CN adequada (e, é claro, aceitá-lo nas Autoridades de Confiança, conforme descrito em outras partes das respostas) . O uso do IIS para criar um certificado autoassinado não criará o CN adequado, então eu descobri o seguinte comando simples usando o Powershell:

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

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

ls cert:\LocalMachine\My 

Para confiar, basta copiar e colar em "Autoridades de certificação raiz confiáveis" usando o Gerenciador de certificados (verifique se você está olhando para os certificados da máquina local, não para o usuário atual!).

Se você se vincular a este 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 do SO, portanto, apenas adicionarei isso no Windows, é mais fácil trabalhar com um arquivo pfx que combina 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);
tomo
fonte
2

no windows, confiei no certificado de desenvolvimento do iis usando o MMC (iniciar> executar> mmc) e, em seguida, adicione o snap-in do certificado, escolhendo "computador local" e aceitando os padrões. Depois que o snap-in do certificado for adicionado, expanda a árvore de certificados do computador local para procurar em Pessoal, selecione o certificado do host local, clique com o botão direito do mouse em> todas as tarefas> exportar. aceite 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://localhostagora é 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 o que também deveria usar o MMC, mas isso funcionou para mim. resolução # 2

cogumelo
fonte
2

Vamos para: chrome://flags/

Habilitar: permite certificados inválidos para recursos carregados do host local.

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

Alphapage
fonte
2

Existem mais aspectos nisso.

Você pode obter o TLS (alguns continuam dizendo SSL) com um certificado, autoassinado ou não.

Para ter uma barra verde para um certificado autoassinado, você também precisa se tornar a Autoridade de Certificação (CA). Esse aspecto está ausente na maioria dos recursos que encontrei na minha jornada para alcançar a barra verde na 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 da CA e do servidor e resultou em minha instalação mostrando uma barra verde no host local Chrome, Firefox e Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Observe: no Chrome, você precisa adicionar o certificado da CA às suas autoridades confiáveis.

Jos
fonte
0

Se você precisar ir além das etapas detalhadas da @ alon e também criar um ca autoassinado:

https.createServer({
  key: fs.readFileSync(NODE_SSL_KEY),
  cert: fs.readFileSync(NODE_SSL_CERT),
  ca: fs.readFileSync(NODE_SSL_CA),
}, app).listen(PORT, () => {});

package.json

"setup:https": "openssl genrsa -out src/server/ssl/localhost.key 2048
&& openssl req -new -x509 -key src/server/ssl/localhost.key -out src/server/ssl/localhost.crt -config src/server/ssl/localhost.cnf
&& openssl req -new -out src/server/ssl/localhost.csr -config src/server/ssl/localhost.cnf
&& openssl x509 -req -in src/server/ssl/localhost.csr -CA src/server/ssl/localhost.crt -CAkey src/server/ssl/localhost.key -CAcreateserial -out src/server/ssl/ca.crt",

Usando o localhost.cnf conforme descrito:

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = UK
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
mummybot
fonte