He empezado a escribir un contenedor para una API que requiere que todas las solicitudes a través de HTTPS. En lugar de hacer peticiones a la API actual mientras estoy en vías de desarrollo y pruebas que me gustaría dirigir mi propio servidor local que se burla de las respuestas.

Estoy confundido acerca de cómo generar los certificados necesito crear un servidor HTTPS y enviar las solicitudes a la misma.

Mi servidor se ve algo como esto:

var options = {
  key: fs.readFileSync('./key.pem'),
  cert: fs.readFileSync('./cert.pem')
};

https.createServer(options, function(req, res) {
  res.writeHead(200);
  res.end('OK\n');
}).listen(8000);

El pem archivos generados con:

openssl genrsa 1024 > key.pem
openssl req -x509 -new -key key.pem > cert.pem

Y pedir que se ve algo como esto:

var options = {
  host: 'localhost',
  port: 8000,
  path: '/api/v1/test'
};

https.request(options, function(res) {
  res.pipe(process.stdout);
}).end();

Con esta configuración puedo obtener Error: DEPTH_ZERO_SELF_SIGNED_CERT, así que creo que tengo que agregar una ca opción para la solicitud.

Así que mi pregunta es ¿cómo debo generar el siguiente:

  1. El servidor key?
  2. El servidor cert?
  3. La ca para la solicitud?

He leído un par de cosas acerca de la generación de auto certificados firmados con openssl, pero parece que no puedo envolver mi cabeza alrededor de ella y averiguar cuál de claves y certificados para el uso donde en mi nodo código.

Actualización

La API proporciona un certificado de CA para usar en lugar de los valores predeterminados. El siguiente código funciona utilizando su certificado y esto es lo que quiero reproducir a nivel local.

var ca = fs.readFileSync('./certificate.pem');

var options = {
  host: 'example.com',
  path: '/api/v1/test',
  ca: ca
};
options.agent = new https.Agent(options);

https.request(options, function(res) {
  res.pipe(process.stdout);
}).end();
InformationsquelleAutor Brett | 2013-10-29

5 Comentarios

  1. 57

    Actualización (Noviembre De 2018): ¿necesidad auto-firmado certs?

    O real de los certificados de hacer el trabajo mejor? Has considerado alguna de estas?

    (Nota: Vamos a Cifrar también puede emitir certificados a redes privadas)

    ScreenCast

    https://coolaj86.com/articles/how-to-create-a-csr-for-https-tls-ssl-rsa-pems/

    Completo, ejemplo de Trabajo

    • crea los certificados de
    • se ejecuta node.js servidor
    • sin advertencias o errores en node.js cliente
    • sin advertencias o errores en el cURL

    https://github.com/coolaj86/nodejs-self-signed-certificate-example

    Utilizando localhost.greenlock.domains como ejemplo (señala a 127.0.0.1):

    server.js

    'use strict';
    
    var https = require('https')
      , port = process.argv[2] || 8043
      , fs = require('fs')
      , path = require('path')
      , server
      , options
      ;
    
    require('ssl-root-cas')
      .inject()
      .addFile(path.join(__dirname, 'server', 'my-private-root-ca.cert.pem'))
      ;
    
    options = {
      //this is ONLY the PRIVATE KEY
      key: fs.readFileSync(path.join(__dirname, 'server', 'privkey.pem'))
      //You DO NOT specify `ca`, that's only for peer authentication
    //, ca: [ fs.readFileSync(path.join(__dirname, 'server', 'my-private-root-ca.cert.pem'))]
      //This should contain both cert.pem AND chain.pem (in that order) 
    , cert: fs.readFileSync(path.join(__dirname, 'server', 'fullchain.pem'))
    };
    
    
    function app(req, res) {
      res.setHeader('Content-Type', 'text/plain');
      res.end('Hello, encrypted world!');
    }
    
    server = https.createServer(options, app).listen(port, function () {
      port = server.address().port;
      console.log('Listening on https://127.0.0.1:' + port);
      console.log('Listening on https://' + server.address().address + ':' + port);
      console.log('Listening on https://localhost.greenlock.domains:' + port);
    });

    client.js

    'use strict';
    
    var https = require('https')
      , fs = require('fs')
      , path = require('path')
      , ca = fs.readFileSync(path.join(__dirname, 'client', 'my-private-root-ca.cert.pem'))
      , port = process.argv[2] || 8043
      , hostname = process.argv[3] || 'localhost.greenlock.domains'
      ;
    
    var options = {
      host: hostname
    , port: port
    , path: '/'
    , ca: ca
    };
    options.agent = new https.Agent(options);
    
    https.request(options, function(res) {
      res.pipe(process.stdout);
    }).end();

    Y el script que hace que los archivos de certificado:

    make-certs.sh

    #!/bin/bash
    FQDN=$1
    # make directories to work from
    mkdir -p server/ client/ all/
    # Create your very own Root Certificate Authority
    openssl genrsa \
    -out all/my-private-root-ca.privkey.pem \
    2048
    # Self-sign your Root Certificate Authority
    # Since this is private, the details can be as bogus as you like
    openssl req \
    -x509 \
    -new \
    -nodes \
    -key all/my-private-root-ca.privkey.pem \
    -days 1024 \
    -out all/my-private-root-ca.cert.pem \
    -subj "/C=US/ST=Utah/L=Provo/O=ACME Signing Authority Inc/CN=example.com"
    # Create a Device Certificate for each domain,
    # such as example.com, *.example.com, awesome.example.com
    # NOTE: You MUST match CN to the domain name or ip address you want to use
    openssl genrsa \
    -out all/privkey.pem \
    2048
    # Create a request from your Device, which your Root CA will sign
    openssl req -new \
    -key all/privkey.pem \
    -out all/csr.pem \
    -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"
    # Sign the request from Device with your Root CA
    openssl x509 \
    -req -in all/csr.pem \
    -CA all/my-private-root-ca.cert.pem \
    -CAkey all/my-private-root-ca.privkey.pem \
    -CAcreateserial \
    -out all/cert.pem \
    -days 500
    # Put things in their proper place
    rsync -a all/{privkey,cert}.pem server/
    cat all/cert.pem > server/fullchain.pem         # we have no intermediates in this case
    rsync -a all/my-private-root-ca.cert.pem server/
    rsync -a all/my-private-root-ca.cert.pem client/
    # create DER format crt for iOS Mobile Safari, etc
    openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt

    Por ejemplo:

    bash make-certs.sh 'localhost.greenlock.domains'

    Esperemos que esto pone el clavo en el ataúd de esta.

    Y un poco más de explicación: https://github.com/coolaj86/node-ssl-root-cas/wiki/Painless-Self-Signed-Certificates-in-node.js

    Instalar privado cert en iOS Mobile Safari

    Necesita crear una copia del certificado de ca raíz de un formato DER con un .crt extensión:

    # create DER format crt for iOS Mobile Safari, etc
    openssl x509 -outform der -in all/my-private-root-ca.cert.pem -out client/my-private-root-ca.crt

    Entonces usted puede simplemente servir a ese archivo en su servidor web. Cuando usted haga clic en el enlace debe preguntará si desea instalar el certificado.

    Para un ejemplo de cómo funciona se puede probar la instalación del MIT Certificado de Autoridad: https://ca.mit.edu/mitca.crt

    Ejemplos Relacionados

    • Lamentablemente, esto no parece ser suficiente. Agregar en websockets, a continuación, intente acceder desde Safari. Incluso si me sirven los cert voy a llegar un mensaje que le pregunta si quiero instalar el cert, pero después de la instalación segura de websockets fallar. Ha tenido suerte con la auto-firmado cert + safari de iOS?
    • Si usted quiere usar en safari necesita añadir la ca raíz. He actualizado el tutorial con un iOS sección.
    • Si usted necesita para obtener la CA pem para el servidor que está llamando el uso de este comando (es el último certificado en la salida) openssl s_client -showcerts -connect www.example.com:443 </dev/null
  2. 10

    Tratar de agregar esto a su solicitud de opciones

    var options = {
    host: 'localhost',
    port: 8000,
    path: '/api/v1/test',
    //These next three lines
    rejectUnauthorized: false,
    requestCert: true,
    agent: false
    };
  3. 3

    Su generación de la clave parece bien. Usted no necesita un ca porque no rechazar sin firmar peticiones.

    Agregar .toString() al final de su readFileSync métodos, de modo que realmente está pasando una cadena, no un objeto de archivo.

    • En la reciente versión de Nodo de la rejectUnauthorized opción se establece en true por defecto, de modo que las solicitudes son rechazadas. El método toString es innecesario, ya que readFileSync devuelve un Búfer cuando sin ningún tipo de codificación se especifica, y el ca cert y key opciones de aceptar un Tampón o una Cadena.
    • Así que ¿significa esto que hizo rechazar sin firmar peticiones falsas y que estaba trabajando?
    • Sí, yo puedo hacer eso, pero no es lo que quiero. La API estoy usando me ha proporcionado un certificado de CA que puedo usar para la autorización, y quiero espejo esta configuración local.
  4. 3

    Este procedimiento permite crear un certificado de la autoridad de & certificado :

    1. agarrar esta ca.cnf archivo que se utiliza como un acceso directo a configuración :

      wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/ca.cnf


    1. crear un nuevo certificado de la autoridad de utilizar esta configuración :

      openssl req -new -x509 -days 9999 -config ca.cnf -keyout ca-key.pem -out ca-cert.pem


    1. ahora que tenemos nuestro certificado de autoridad en ca-key.pem y ca-cert.pem, vamos a generar una clave privada para el servidor :

      openssl genrsa -out key.pem 4096


    1. agarrar esta server.cnf archivo que se utiliza como un acceso directo a configuración :

      wget https://raw.githubusercontent.com/anders94/https-authorized-clients/master/keys/server.cnf


    1. generar la solicitud de certificado de firma con esta configuración :

      openssl req -new -config server.cnf -key key.pem -out csr.pem


    1. firmar la solicitud :

      openssl x509 -req -extfile server.cnf -days 999 -passin "pass:password" -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem

    He encontrado este procedimiento aquí, junto con más información sobre cómo utilizar estos certificados.

    • Puedo utilizar este enfoque en la producción?

Dejar respuesta

Please enter your comment!
Please enter your name here