# Creazione del certificato digitale per un SERVER
# 2023 - prof. Roberto Fuligni
#
# 0. Operazioni preliminari: 
#    Mostra la versione del software "openssl"
#    Elenca i parametri di tipo  "Elliptic Curves" supportati

openssl version -a
openssl ecparam -list_curves

# 1a. Creazione della coppia di chiavi EC basata sulla curva P-256.
#    Il file contenente le chiavi (di estensione .key) e' memorizzato nella 
#    sottocartella "private" ed e' protetto mediante password e 
#    algoritmo di cifratura AES256.
#    Per visualizzare le chiavi: openssl pkey -in private\server-01.key -text -noout 
 
openssl genpkey -aes256 -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out private\server-01.key

# 1b. (Alternativo a 1a) Creazione della coppia di  chiavi RSA 2048 bit.
#    openssl genpkey -aes256 -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private\server-01.key
 
# 2. Creazione di una nuova richiesta di certificato per il server 
#    (CSR - Certificate Signing Request).
#    Il file di richiesta (estensione .csr) e' memorizzato nella cartella "csr".
#    Il nome principale del server (CN, Common Name) è server-01.abcsoluzioni.eu.
#    Il server dispone inoltre di due alias DNS: mirror1.abcsoluzioni.eu e mirror2.abcsoluzioni.eu 

openssl req -new -key private\server-01.key -subj "/C=IT/ST=Novara/L=Novara/O=ABC Soluzioni/CN=server-01.abcsoluzioni.eu" -addext "subjectAltName = DNS:mirror1.abcsoluzioni.eu, DNS:mirror2.abcsoluzioni.eu" -text -out csr\server-01.csr

# 3. Verifica della richiesta.

openssl req -noout -text -in csr\server-01.csr

# 4. Invio della richiesta di certificato CSR alla INTERMEDIATE CA e memorizzazione del certificato ricevuto
#    nella sottocartella "certs".

# 5. Verifica del contenuto del certificato del SERVER con il comando:
    
openssl x509 -noout -text -in certs\server-01.crt

# 6. Esportazione delle chiavi del SERVER e della catena di certificati (SERVER, INTERMEDIATE e ROOT CA)
#    in formato PKCS#12 (con password di protezione)

openssl pkcs12 -export -out pkcs12\server-01.p12 -inkey private\server-01.key -in certs\server-01.crt -certfile ..\INTERMEDIATE-CA\certs\abc-chain-ca.crt

# 7. Visualizzazione del contenuto del file PKCS#12

openssl pkcs12 -in pkcs12\server-01.p12 -info -passout pass:
