#!/bin/sh
# Crea una autoridad de certificación de la clase y varios certificados para demo.redes.test:
#   ca.crt            la CA, que solo conoce quien la instale
#   good.crt          firmado por la CA, con el nombre correcto
#   wrongname.crt     firmado por la CA, pero para otro nombre
#   expired.crt       firmado por la CA, ya vencido
#   selfsigned.crt    firmado por sí mismo
# Uso: pki.sh <carpeta>. Las claves son de clase: no sirven para nada fuera de este laboratorio.
set -eu
out=$1
mkdir -p "$out"
cd "$out"

key() { openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 -out "$1" 2>/dev/null; }

key ca.key
openssl req -x509 -new -key ca.key -days 30 -subj "/O=Curso de Redes/CN=CA de la clase" -out ca.crt

# leaf <archivo> <nombre> [opciones de openssl x509]
leaf() {
    name=$1; dns=$2; shift 2
    key "$name.key"
    openssl req -new -key "$name.key" -subj "/CN=$dns" -out "$name.csr"
    printf 'subjectAltName=DNS:%s\nbasicConstraints=CA:FALSE\n' "$dns" > "$name.ext"
    openssl x509 -req -in "$name.csr" -CA ca.crt -CAkey ca.key -CAcreateserial \
        -extfile "$name.ext" -out "$name.crt" "$@" 2>/dev/null
    rm -f "$name.csr" "$name.ext"
}

leaf good demo.redes.test -days 30
leaf wrongname otro.redes.test -days 30
leaf expired demo.redes.test -not_before 20200101000000Z -not_after 20200201000000Z

key selfsigned.key
openssl req -x509 -new -key selfsigned.key -days 30 -subj "/CN=demo.redes.test" \
    -addext "subjectAltName=DNS:demo.redes.test" -out selfsigned.crt
