crear un certificado SSL autofirmado de confianza para localhost (para uso con Express / Node)

Intentando seguir varias instrucciones para crear un certificado autofirmado para su uso con localhost, la mayoría de las instrucciones parecen ser para IIS, pero estoy tratando de usar Nodejs / Express. Ninguno de ellos funciona correctamente porque, mientras se instala el certificado, no es de confianza. esto es lo que he intentado que falla:

  • ¿Cómo puedo crear un certificado autofirmado 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/

¿Alguien puede ofrecer un flujo de trabajo que puede hacer esto? Puedo obtener un cert instalado, pero no puedo hacer que el certificado sea confiable ni en chrome (v32) ni en IE (v10).

EDITAR: se sugirió en los comentarios que el problema no es cert-root de confianza. Instalé el certificado a través de IE pero todavía no es confiable.

Puedes probar openSSL para generar certificados. Echa un vistazo a esto .

Necesitará un archivo .key y .crt para agregar HTTPS al servidor expreso JS del nodo. Una vez que genere esto, use este código para agregar HTTPS al 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"); }); 

Esto funciona bien en mi máquina local, así como también en el servidor donde implementé esto. El que tengo en el servidor fue comprado de goDaddy pero localhost tenía un certificado autofirmado.

Sin embargo, cada navegador arrojó un error que indica que la conexión no es de confianza, ¿desea continuar? Después de hacer clic en continuar, funcionó bien.

Si alguien alguna vez ha pasado por alto este error con un certificado autofirmado, por favor ilumine.

La forma más corta. Probado en MacOS, pero puede funcionar de manera similar en otros sistemas operativos.

Generar pem

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

Su servidor express

 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 en Google Chrome y verá que no es seguro. ¡Todavía!
  • En Herramientas del desarrollador> Seguridad> Ver certificado: arrastre la imagen a su escritorio y haga doble clic en ella.
  • Haga clic en ‘Agregar’
  • Encuéntrelo en Acceso a Llaveros y haga doble clic en él
  • Expanda ‘Confiar’ y cambie ‘Al usar este certificado’ a ‘Confiar siempre’.
  • Es posible que se le pida que se autentique.
  • Reinicia tu servidor.
  • Actualiza tu navegador
  • ¡Disfrutar! 🙂

Las respuestas anteriores fueron parciales. He pasado tanto tiempo haciendo que esto funcione, es una locura. Nota para mi yo futuro, esto es lo que debe hacer:

Estoy trabajando en Windows 10, con Chrome 65. Firefox se está comportando muy bien, solo confirma localhost como una excepción de seguridad y funcionará. Chrome no:

Paso 1. en tu backend, crea una carpeta llamada security . trabajaremos dentro de eso.

Paso 2. crea un archivo de configuración de solicitud llamado req.cnf con el siguiente contenido (el crédito va a: @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 

Una explicación de este campo está aquí .

Paso 3. Navega a la carpeta de seguridad en el terminal y escribe el siguiente comando:

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

Paso 4. luego fuera de security carpeta de security , en tu aplicación expresa haz algo como esto: (el crédito va a @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) }) 

Paso 5. node server.js el servidor, node server.js , y vaya a https: // localhost: 3000 .

En este punto tenemos la configuración del servidor. Pero el navegador debería mostrar un mensaje de advertencia.

Necesitamos registrar nuestro certificado autofirmado, como Autoridad certificadora de CA, en la tienda de certificados de Chrome / Windows. (Chrome también guarda esto en Windows,)

Paso 6. abra Dev Tools en chrome, vaya al panel de seguridad, luego haga clic en View Certificate. enter image description here

Paso 7. Vaya al panel Detalles, haga clic en Copiar archivo, luego cuando aparezca el Asistente para exportación de certificados, haga clic en Siguiente como se muestra a continuación:

ir a detalles - copiar archivo - siguiente en el asistente de exportación

Paso 8. Deje la encoding DER, haga clic en Siguiente, elija Browse , colóquelo en una carpeta de fácil acceso como Escritorio y localhost.cer, then click Save and then Finish. nombre al certificado localhost.cer, then click Save and then Finish. . Debería poder ver su certificado en el escritorio.

Paso 9. Abre chrome://settings/ insertándolo en el cuadro url. Abajo, haga clic en Advanced / Advanced Options , luego desplácese hacia abajo para encontrar Manage Certificates .

elegir administrar certificados

Paso 10. Vaya al panel Autoridades de certificación raíz de confianza y haga clic en importar.

Vaya al panel Autoridades de certificación raíz de confianza y haga clic en importar

Importaremos el certificado localhost.cer que acabamos de exportar en el paso 8.

Paso 11. haga clic en browse, busque el localhost.cer , deje los valores predeterminados, haga clic en siguiente un montón de veces; hasta que aparezca esta advertencia, haga clic en sí.

confirmar la excepción de seguridad

Paso 12. cierra todo y reinicia Chrome. Luego, cuando vayas a https://localhost:3000 deberías ver: tengo que amar el verde

Cómo generar un certificado SSL para localhost: enlace

 openssl genrsa -des3 -out server.key 1024 

debe ingresar una contraseña aquí, que debe volver a escribir en los siguientes pasos

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

cuando se le preguntó “Nombre común” escriba en: localhost

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

Esto es lo que funciona para mí

en ventanas

1) Agregue esto a su archivo% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net (el navegador cause problemas con ‘localhost’ (para scripts de origen cruzado)

Windows Vista y Windows 7 Vista y Windows 7 usan User Account Control (UAC) para que el Bloc de notas se ejecute como administrador.

  1. Haga clic en Inicio -> Todos los progtwigs -> Accesorios

  2. Haga clic derecho en el Bloc de notas y seleccione Ejecutar como administrador

  3. Haga clic en Continuar en la ventana de UAC “Windows necesita su permiso”.

  4. Cuando se abre el Bloc de notas Haga clic en Archivo -> Abrir

  5. En el campo de nombre de archivo escriba C: \ Windows \ System32 \ Drivers \ etc \ hosts

  6. Haga clic en Abrir

  7. Agregue esto a su archivo% WINDIR% \ System32 \ drivers \ etc \ hosts: 127.0.0.1 localdev.YOURSITE.net

  8. Salvar

  9. Cierre y reinicie los navegadores

En Mac o Linux:

  1. Abra / etc / hosts con su permiso
  2. Agregar 127.0.0.1 localdev.YOURSITE.net
  3. Guardarlo

Al desarrollar, utiliza localdev.YOURSITE.net en lugar de localhost, por lo que si está utilizando configuraciones de ejecución / depuración en su ide, asegúrese de actualizarlo.

Use “.YOURSITE.net” como dominio_chinado (con un punto al principio) al crear la cookie, entonces debería funcionar con todos los subdominios.

2) crea el certificado usando ese localdev.url

SUGERENCIA: si tiene problemas para generar certificados en Windows, use una máquina VirtualBox o Vmware en su lugar.

3) importe el certificado como se describe en http://www.charlesproxy.com/documentation/using-charles/ssl-certificates/

Si está utilizando un nodo, ¿por qué no generarlos con un nodo? Este módulo parece ser bastante completo:

Tenga en cuenta que no generaría sobre la marcha. Genere con algún tipo de script de comstackción para que tenga un certificado y una clave consistentes. De lo contrario, deberá autorizar el certificado autofirmado recientemente generado cada vez.

Si está en OSX / Chrome puede agregar el certificado SSL autofirmado a su llavero del sistema como se explica aquí: http://www.robpeck.com/2010/10/google-chrome-mac-os-x-and -self-signed-ssl-certificates

Es un proceso manual, pero lo tengo trabajando finalmente. Solo asegúrese de que el Nombre común (CN) esté configurado como “localhost” (sin el puerto) y después de agregar el certificado, asegúrese de que todas las opciones de Confianza del certificado estén configuradas en “Confiar siempre”. También asegúrese de agregarlo al llavero “Sistema” y no al llavero “iniciar sesión”.

en Windows hice que el certificado de desarrollo iis fuera confiable utilizando MMC (inicio> ejecutar> mmc), luego agregué el complemento del certificado, elegí “computadora local” y acepté los valores predeterminados. Una vez que se agrega esa instantánea de certificado, expanda el árbol de certificados de la computadora local para buscar en Personal, seleccione el certificado de servidor local, haga clic con el botón derecho en> todas las tareas> exportar. acepte todos los valores predeterminados en el asistente de exportación.

Una vez que se haya guardado ese archivo, expanda los certificados de confianza y comience a importar el certificado que acaba de exportar. https://localhost ahora es de confianza en Chrome y no tiene advertencias de seguridad.

Utilicé esta resolución de guía n . ° 2 del blog de MSDN, la op también compartió un enlace en su pregunta acerca de que también debería usar MMC, pero esto funcionó para mí. resolución n. ° 2

Hay más aspectos en esto.

Puede lograr TLS (algunos siguen diciendo SSL) con un certificado, autofirmado o no.

Para tener una barra verde para un certificado autofirmado, también debe convertirse en la Autoridad de certificación (CA). Este aspecto falta en la mayoría de los recursos que encontré en mi viaje para lograr la barra verde en mi configuración de desarrollo local. Convertirse en CA es tan fácil como crear un certificado.

Este recurso cubre la creación tanto del certificado de CA como del certificado de Servidor y dio como resultado que mi configuración muestre una barra verde en localhost Chrome, Firefox y Edge: https://ram.k0a1a.net/self-signed_https_cert_after_chrome_58

Ir a: chrome://flags/

Habilitar: Permitir certificados no válidos para recursos cargados desde localhost.

No tiene la seguridad verde, pero siempre tiene permitido https: // localhost en Chrome.

Algunas de las respuestas publicadas tienen piezas que me fueron muy útiles para superar este problema también. Sin embargo, también me interesaba el número mínimo de pasos e, idealmente, evitar OpenSSL (en Windows 10).

Entonces, una pieza crítica de las respuestas (crédito: @ TroyWorks ) es que necesita editar su archivo HOSTS para crear un servidor ficticio, y asignarlo a 127.0.0.1. Esto supone que vas a estar haciendo un desarrollo local.

En mi caso, estaba usando el certificado SS para asegurar un websocket en NodeJS, y ese socket estaba siendo conectado programáticamente (a diferencia de a través del navegador). Entonces, para mí, era fundamental que se aceptara el certificado sin advertencias ni errores, y la pieza clave allí era obtener el certificado creado con un CN apropiado (y, por supuesto, aceptar el certificado en Autoridades de confianza, como se describe en otras partes de las respuestas) . Usar IIS para crear un certificado autofirmado no creará el CN ​​apropiado, así que descubrí el siguiente comando simple usando Powershell:

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

Esto debe ejecutarse en la consola de Administración de PS, pero simplemente funciona y coloca el certificado en la sección “Personal” del almacén de certificados de LocalMachine. Puede verificar que se creó al ejecutar:

 ls cert:\LocalMachine\My 

Para confiar en él, simplemente copia esto y pégalo en “Autoridades de certificación de raíz de confianza” usando el Administrador de certificados (¡asegúrate de estar mirando los certificados de Máquina local, no el Usuario actual!).

Si se vincula a este certificado en IIS, debería poder presionar https://gandalf.dummy.dev/ y obtener una conexión segura sin advertencias.

La última parte, usando esto en NodeJS, se describe más arriba y en otras respuestas de SO, así que solo agregaré eso en Windows, es más fácil trabajar con un archivo pfx que combine el certificado y la clave privada. Puede exportar un pfx fácilmente desde el Administrador de certificados, pero afecta cómo lo usa en NodeJS. Al crear un servidor usando el módulo ‘https’, las opciones que usaría (en lugar de ‘clave’ y ‘cert’) serían ‘pfx’ y ‘frase de contraseña’, como en:

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