Una CSR non è altro che una proposta (firmata) del tipo di certificato che si desidera avere. In realtà non è davvero necessario creare un certificato, cioè un certificato può essere creato completamente senza prima avere un CSR.
La proposta CSR contiene la chiave pubblica che dovrebbe essere inclusa nel certificato finale e contiene cose come soggetto, nomi alternativi ecc. che propongono di aggiungere anche al certificato. Il CSR è firmato con la tua chiave privata in modo che la CA possa verificare che tu possieda effettivamente la chiave privata corrispondente alla chiave pubblica del certificato.
La CA prende le informazioni dal tuo CSR che gli piace quando crea un certificato e aggiunge anche molte informazioni da sola, cioè non prese dal CSR. Prenderà la chiave pubblica dal CSR. L'argomento che aggiunge al certificato sarà probabilmente basato sulla tua proposta di CSR, ma potrebbe anche modificarlo, aggiungere soggetti alternativi che non hai aggiunto (ad esempio potresti aggiungere www.domain
) ed escludere altri che hai cercato di intrufolare ecc. Aggiungerà anche il tempo di inizio e di scadenza, AIA (come URL per le richieste OCSP), informazioni sull'emittente, scopo del certificato ... - e la maggior parte di questi non saranno presi dalla CSR originale.
Basically I am attempting to act as my own CA using OpenSSL (1.1.0i)
Non sono sicuro se e in che modo si possa usare lo strumento openssl
per creare gerarchie di certificati senza CSR, ma si può sicuramente farlo con la libreria OpenSSL. Ad esempio, creo regolarmente certificati di test con certificato root, intermedio e leaf come questo in Perl senza bisogno di alcun 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');