¿Cómo crear mi propia cadena de certificados?

62

Me gustaría configurar mi propio respondedor OCSP (solo con fines de prueba). Esto requiere que tenga un certificado raíz y algunos certificados generados a partir de él.

He logrado crear un certificado autofirmado con openssl. Quiero usarlo como certificado raíz. El siguiente paso sería crear los certificados derivados. Sin embargo, parece que no puedo encontrar la documentación sobre cómo hacer esto. ¿Alguien sabe dónde puedo encontrar esta información?

Editar
En retrospectiva, mi pregunta aún no está completamente respondida. Para aclarar el problema, representaré mi cadena de certificados de esta manera:

RAÍZ -> A -> B -> C -> ...

Actualmente puedo crear los certificados ROOT y A, pero no he descubierto cómo hacer una cadena más larga.

Mi comando para crear el certificado raíz es:

openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem

El certificado A se crea así:

openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl ca -in client.csr -out client.cer

Este comando depende implícitamente del certificado raíz, para el cual encuentra la información requerida en el archivo de configuración openssl.

Sin embargo, el Certificado B solo debe confiar en A, que no está registrado en el archivo de configuración, por lo que el comando anterior no funcionará aquí.

¿Qué línea de comando debo usar para crear certificados B y más allá?

Editar
Encontré la respuesta en este artículo . El certificado B (cadena A -> B) se puede crear con estos dos comandos:

# Create a certificate request
openssl req -new -keyout B.key -out B.request -days 365

# Create and sign the certificate
openssl ca -policy policy_anything -keyfile A.key -cert A.pem -out B.pem -infiles B.request

También cambié el archivo openssl.cnf:

[ usr_cert ]
basicConstraints=CA:TRUE # prev value was FALSE

Este enfoque parece estar funcionando bien.

Apilado
fuente
El enlace en la parte inferior de la sección de edición se rompe
enthusiasticgeek
2
Hasta 2015, el artículo mencionado en la última edición de esta publicación está muerto. Para que pueda consultar la página a través de un archivo web : web.archive.org/web/20100504162138/http://www.ibm.com/…
Iomanip
Consulte 8gwifi.org/cafunctions.jsp
anish el

Respuestas:

28

Puede usar OpenSSL directamente.

  1. Cree una clave privada de la Autoridad de certificación (esta es su clave más importante):

    openssl req -new -newkey rsa:1024 -nodes -out ca.csr -keyout ca.key
    
  2. Cree su certificado autofirmado de CA:

    openssl x509 -trustout -signkey ca.key -days 365 -req -in ca.csr -out ca.pem
    
  3. Emita un certificado de cliente generando primero la clave, luego solicite (o use uno proporcionado por un sistema externo) y luego firme el certificado utilizando la clave privada de su CA:

    openssl genrsa -out client.key 1024
    openssl req -new -key client.key -out client.csr
    openssl ca -in client.csr -out client.cer
    

(Es posible que deba agregar algunas opciones ya que estoy usando estos comandos junto con mi archivo openssl.conf. Es posible que primero necesite configurar su propio archivo .conf).

twk
fuente
Gracias, sus instrucciones funcionaron después de algunos ajustes de mi archivo openssl.conf.
StackedCrooked
3
@twk: tenga en cuenta que la pregunta requiere un paso más para obtener una respuesta completa: cómo crear otro certificado que solo dependa del certificado creado en el paso 3, pero no del certificado raíz.
quack quijote
3
Falla en el último paso con "no se puede cargar la clave privada de CA"; Puedo llegar hasta allí al proporcionar la clave y el certificado openssl ca -in client.csr -out client.cer -cern ca.pem -keyfile ca.key, pero necesita un demoCAdirectorio y varios accesorios.
Iiridayn
23
"Es posible que deba agregar algunas opciones ..." realmente elimina la utilidad de esta respuesta.
Zach
14

Una vez que haya creado su CA, puede usarla para firmar así:

  • Crea una clave:

    openssl genrsa -out key_A.key  1024
    
  • Crea una csr:

    openssl req -new -key key_A.key -out csr_A.csr
    You are about to be asked to enter information etc....
    
  • Firmarlo :

    openssl x509 -req -days 365 -in csr_A.csr -CA CA_certificate_you_created.crt \
    -CAkey CA_key_you_created.key -set_serial 01 -out crt_A.crt
    

    y así sucesivamente reemplazando * _A con * _B y CA_certificate_you_created.crtcon crt_A.crty CA_key_you_created.keyconkey_A.key

Tu cambio:

basicConstraints=CA:TRUE  # prev value was FALSE

significa que los certificados que emite se pueden usar para firmar otros certificados.

Mr_and_Mrs_D
fuente
gracias, muy útil
flotto
1
¿Qué archivo .crt?
MickyD
9

OpenSSL viene con un script de Perl "CA.pl" para ayudarlo a crear un certificado de CA raíz autofirmado, junto con la clave privada correspondiente, además de algunos archivos y directorios simples para ayudar a realizar un seguimiento de cualquier certificado futuro que firme (también conocido como problema ) con esa raíz CA. También le ayuda a generar otros pares de claves y solicitudes de firma de certificados (CSR) y le ayuda a procesar esos CSR (es decir, emitir certificados para ellos) y más.

Tenga en cuenta que muchos productos requieren que los certificados de CA contengan un determinado atributo que los marque como certificados de CA, o no serán aceptados como firmantes / emisores válidos de otros certificados. Si el certificado autofirmado que creó no contiene ese atributo, es posible que tenga problemas para que otro software lo trate como un certificado de CA raíz válido.

Si recuerdo correctamente, la sintaxis es algo así:

CA.pl -newca    # Create a new root CA  

CA.pl -newreq   # Create a new CSR

CA.pl -sign     # Sign a CSR, creating a cert  

CA.pl -pkcs12   # Turn an issued cert, plus its matching private key and trust chain, into a .p12 file you can install on another machine    
Spiff
fuente
44
Esto fue útil. En Ubuntu 14.04 encontré el archivo en/usr/lib/ssl/misc/CA.pl
Colin M
-1

Encontré esta publicación: https://stackoverflow.com/questions/19665863/how-do-i-use-a-self-signed-certificate-for-a-https-node-js-server

Es para Node.JS, pero el script en este repositorio de GitHub usa comandos openSLL para crear un certificado raíz de CA y un certificado de dominio.

Ejecutar usando: bash make-root-ca-and-certificates.sh 'example.com'

O para localhost usando: bash make-root-ca-and-certificates.sh 'localhost'

make-root-ca-and-certificates.sh

#!/bin/bash
FQDN=$1

# make directories to work from
mkdir -p certs/{server,client,ca,tmp}

# Create your very own Root Certificate Authority
openssl genrsa \
  -out certs/ca/my-root-ca.key.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 certs/ca/my-root-ca.key.pem \
  -days 1024 \
  -out certs/ca/my-root-ca.crt.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 certs/server/privkey.pem \
  2048

# Create a request from your Device, which your Root CA will sign
openssl req -new \
  -key certs/server/privkey.pem \
  -out certs/tmp/csr.pem \
  -subj "/C=US/ST=Utah/L=Provo/O=ACME Tech Inc/CN=${FQDN}"

# Sign the request from Device with your Root CA
# -CAserial certs/ca/my-root-ca.srl
openssl x509 \
  -req -in certs/tmp/csr.pem \
  -CA certs/ca/my-root-ca.crt.pem \
  -CAkey certs/ca/my-root-ca.key.pem \
  -CAcreateserial \
  -out certs/server/cert.pem \
  -days 500

# Create a public key, for funzies
# see https://gist.github.com/coolaj86/f6f36efce2821dfb046d
openssl rsa \
  -in certs/server/privkey.pem \
  -pubout -out certs/client/pubkey.pem

# Put things in their proper place
rsync -a certs/ca/my-root-ca.crt.pem certs/server/chain.pem
rsync -a certs/ca/my-root-ca.crt.pem certs/client/chain.pem
cat certs/server/cert.pem certs/server/chain.pem > certs/server/fullchain.pem
Ralph Bisschops
fuente