Una CSR no es más que una propuesta (firmada) de qué tipo de certificado desea tener. Realmente no es realmente necesario crear un certificado, es decir, un certificado podría crearse completamente sin tener primero un CSR.
La propuesta de CSR contiene la clave pública que debe incluirse en el certificado final y contiene elementos como el sujeto, los nombres alternativos del sujeto, etc. que se proponen agregar al certificado también. La CSR está firmada con su clave privada para que la CA pueda verificar que realmente posee la clave privada que coincide con la clave pública del certificado.
La CA toma la información de su CSR que le gusta al crear un certificado y también agrega mucha información por sí misma, es decir, no se toma de la CSR. Tomará la clave pública de la RSE. El asunto que agrega al certificado probablemente se basará en su propuesta de CSR, pero también podría modificarlo, agregar nombres alternativos de sujeto que no haya agregado (es decir, podría agregar www.domain
) y excluir otros que haya intentado escabullirse. También agregará tiempo de inicio y vencimiento, AIA (como la URL para solicitudes de OCSP), información del emisor, propósito del certificado ... y la mayoría de estos no se tomarán del CSR original.
Básicamente estoy intentando actuar como mi propia CA utilizando OpenSSL (1.1.0i)
No estoy seguro de si y cómo se podría usar la herramienta openssl
para crear jerarquías de certificados sin CSR, pero definitivamente se puede hacer esto con la biblioteca OpenSSL. Por ejemplo, creo regularmente certificados de prueba con certificados de raíz, intermedios y de hoja como este en Perl sin necesidad de ningún CSR:
use strict;
use warnings;
use IO::Socket::SSL::Utils;
my @root = CERT_create(
subject => { CN => 'root' },
CA => 1,
);
PEM_cert2file($root[0],'root-cert.pem');
PEM_key2file($root[1],'root-key.pem');
my @middle = CERT_create(
issuer => \@root,
subject => { CN => 'middle' },
CA => 1,
);
PEM_cert2file($middle[0],'middle-cert.pem');
PEM_key2file($middle[1],'middle-key.pem');
my @leaf = CERT_create(
subject => { CN => 'example.com' },
subjectAltNames => [
[ 'DNS', 'example.com' ],
[ 'DNS', 'www.example.com' ],
[ 'IP', '10.0.3.4' ],
],
purpose => 'server',
issuer => \@middle,
);
PEM_cert2file($leaf[0],'server-cert.pem');
PEM_key2file($leaf[1],'server-key.pem');