ca

ca.git
git clone git://git.lenczewski.org/ca.git
Log | Files | Refs | README

commit 5a81f382b2a9d9076439c4e598a977c6daa9a546
parent 12df907bebff4029abf2bacd32ac0cb6924f44d1
Author: MikoĊ‚aj Lenczewski <mikolaj@lenczewski.org>
Date:   Tue,  5 May 2026 02:13:38 +0100

Add ECC support

Diffstat:
Minit-ca.sh | 39+++++++++++++++++++++++++--------------
Mmake-ca-crl.sh | 4+++-
Mmake-cert.sh | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Mmake-intermediate-ca.sh | 89+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Mrevoke-cert.sh | 7++++++-
Mrevoke-intermediate-ca.sh | 3++-
6 files changed, 152 insertions(+), 70 deletions(-)

diff --git a/init-ca.sh b/init-ca.sh @@ -55,10 +55,6 @@ database = \$dir/index.txt serial = \$dir/serial RANDFILE = \$dir/priv/.rand -# root key and certificate -private_key = \$dir/priv/ca.key.pem -certificate = \$dir/cert/ca.crt.pem - # certificate revocation list config crlnumber = \$dir/crlnumber crl = \$dir/crl/ca.crl.pem @@ -94,22 +90,37 @@ cat >>ca/openssl.cnf < frag.cnf # create the root certificate -# generate the key -openssl genrsa -aes256 -out ca/priv/ca.key.pem 4096 -chmod 400 ca/priv/ca.key.pem +# generate keys +openssl genrsa -aes256 \ + -out ca/priv/ca.rsa.key.pem 4096 + +openssl genpkey -aes256 -algorithm EC -pkeyopt ec_paramgen_curve:P-256 \ + -out ca/priv/ca.ecc.key.pem + +chmod 400 ca/priv/ca.rsa.key.pem ca/priv/ca.ecc.key.pem + +# generate certificates +openssl req -config ca/openssl.cnf \ + -new -x509 -days 36500 -extensions v3_ca \ + -subj "/C=$C/ST=$ST/O=$O/CN=$O Root CA (RSA)" \ + -key ca/priv/ca.rsa.key.pem \ + -out ca/cert/ca.rsa.crt.pem -# generate the certificate openssl req -config ca/openssl.cnf \ -new -x509 -days 36500 -extensions v3_ca \ - -subj "/C=$C/ST=$ST/O=$O/CN=$O Root CA" \ - -key ca/priv/ca.key.pem \ - -out ca/cert/ca.crt.pem + -subj "/C=$C/ST=$ST/O=$O/CN=$O Root CA (ECC)" \ + -key ca/priv/ca.ecc.key.pem \ + -out ca/cert/ca.ecc.crt.pem -chmod 444 ca/cert/ca.crt.pem +chmod 444 ca/cert/ca.rsa.crt.pem ca/cert/ca.ecc.crt.pem # verify the certificate -openssl x509 -noout -text -in ca/cert/ca.crt.pem +openssl x509 -noout -text -in ca/cert/ca.rsa.crt.pem +openssl x509 -noout -text -in ca/cert/ca.ecc.crt.pem echo "NOTE: Install the root certificate on all devices" -echo "NOTE: Root certificate is found in 'ca/cert/ca.crt.pem'" +echo "NOTE: Root RSA key is found in 'ca/priv/ca.rsa.key.pem'" +echo "NOTE: Root RSA certificate is found in 'ca/cert/ca.rsa.crt.pem'" +echo "NOTE: Root ECC key is found in 'ca/priv/ca.ecc.key.pem'" +echo "NOTE: Root ECC certificate is found in 'ca/cert/ca.ecc.crt.pem'" echo "NOTE: Please run 'make-intermediate-ca.sh' at least once" diff --git a/make-ca-crl.sh b/make-ca-crl.sh @@ -5,4 +5,6 @@ set -ex # generate the crl openssl ca -config ca/openssl.cnf \ - -gencrl -out ca/intermediate/crl/intermediate.crl.pem + -cert ca/cert/ca.ecc.crt.pem -keyfile ca/priv/ca.ecc.key.pem \ + -gencrl \ + -out ca/intermediate/crl/intermediate-$(date '+%Y-%m-%d').crl.pem diff --git a/make-cert.sh b/make-cert.sh @@ -6,6 +6,7 @@ shift 2 EXTRA="$(echo $@ | xargs printf '%s\n' | paste -s -d '/' -)" +ECC="${ECC:-1}" PCKSPASS="${PCKSPASS:-password}" DAYS="${DAYS:-730}" @@ -28,14 +29,6 @@ set -ex mkdir -p certs certs/$TYPE "certs/$TYPE/$DOMAIN" -# generate the key -openssl genrsa \ - -out "certs/$TYPE/$DOMAIN/$DOMAIN.key.pem" 4096 - -chmod 600 "certs/$TYPE/$DOMAIN/$DOMAIN.key.pem" - -# generate the certificate - C=$(cat ca.country.txt) ST=$(cat ca.state.txt) O=$(cat ca.organization.txt) @@ -49,23 +42,66 @@ O=$(cat ca.organization.txt) [ "${O:-PLACEHOLDER}" = "PLACEHOLDER" ] && \ echo "Please fill in ca.organization.txt!" && exit 1 -openssl req -config ca/intermediate/current/openssl_usr.cnf \ - -key "certs/$TYPE/$DOMAIN/$DOMAIN.key.pem" \ - -new -subj "/C=$C/ST=$ST/O=$O/CN=${DOMAIN}/${EXTRA}" \ - -out "certs/$TYPE/$DOMAIN/$DOMAIN.csr.pem" +# generate keys + +openssl genrsa \ + -out "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.key.pem" 4096 -openssl ca -config ca/intermediate/current/openssl_usr.cnf \ - -days $DAYS -notext -extensions ${TYPE}_cert \ - -in "certs/$TYPE/$DOMAIN/$DOMAIN.csr.pem" \ - -out "certs/$TYPE/$DOMAIN/$DOMAIN.crt.pem" +openssl genpkey -algorithm EC -pkeyopt ec_paramgen_curve:P-256 \ + -out "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.key.pem" -chmod 644 "certs/$TYPE/$DOMAIN/$DOMAIN.crt.pem" +chmod 600 \ + "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.key.pem" \ + "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.key.pem" + +# generate the certificate + +if [ "${ECC}" = "1" ]; then + openssl req -config ca/intermediate/current/openssl_usr.cnf \ + -new -subj "/C=$C/ST=$ST/O=$O/CN=${DOMAIN}/${EXTRA}" \ + -key "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.key.pem" \ + -out "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.csr.pem" + + openssl ca -config ca/intermediate/current/openssl_usr.cnf \ + -cert ca/intermediate/current/cert/intermediate.ecc.crt.pem \ + -keyfile ca/intermediate/current/priv/intermediate.ecc.key.pem \ + -days $DAYS -notext -extensions ${TYPE}_cert \ + -in "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.csr.pem" \ + -out "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.crt.pem" + + chmod 644 "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.crt.pem" +else + openssl req -config ca/intermediate/current/openssl_usr.cnf \ + -new -subj "/C=$C/ST=$ST/O=$O/CN=${DOMAIN}/${EXTRA}" \ + -key "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.key.pem" \ + -out "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.csr.pem" + + openssl ca -config ca/intermediate/current/openssl_usr.cnf \ + -cert ca/intermediate/current/cert/intermediate.rsa.crt.pem \ + -keyfile ca/intermediate/current/priv/intermediate.rsa.key.pem \ + -days $DAYS -notext -extensions ${TYPE}_cert \ + -in "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.csr.pem" \ + -out "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.crt.pem" + + chmod 644 "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.crt.pem" +fi # verify the certificate -openssl x509 -noout -text -in "certs/$TYPE/$DOMAIN/$DOMAIN.crt.pem" -openssl verify -CAfile ca/intermediate/current/cert/ca-chain.pem \ - "certs/$TYPE/$DOMAIN/$DOMAIN.crt.pem" +if [ "${ECC}" = "1" ]; then + openssl x509 -noout -text -in "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.crt.pem" + openssl verify -CAfile ca/intermediate/current/cert/ca-chain.pem \ + "certs/$TYPE/$DOMAIN/$DOMAIN.ecc.crt.pem" +else + openssl x509 -noout -text -in "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.crt.pem" + openssl verify -CAfile ca/intermediate/current/cert/ca-chain.pem \ + "certs/$TYPE/$DOMAIN/$DOMAIN.rsa.crt.pem" +fi # publish certificate -echo "NOTE: Certificate key is found in 'certs/$TYPE/$DOMAIN/$DOMAIN.key.pem'" -echo "NOTE: Certificate is found in 'certs/$TYPE/$DOMAIN/$DOMAIN.crt.pem'" +if [ "${ECC}" = "1" ]; then + echo "NOTE: ECC key is found in 'certs/$TYPE/$DOMAIN/$DOMAIN.ecc.key.pem'" + echo "NOTE: ECC certificate is found in 'certs/$TYPE/$DOMAIN/$DOMAIN.ecc.crt.pem'" +else + echo "NOTE: RSA key is found in 'certs/$TYPE/$DOMAIN/$DOMAIN.rsa.key.pem'" + echo "NOTE: RSA certificate is found in 'certs/$TYPE/$DOMAIN/$DOMAIN.rsa.crt.pem'" +fi diff --git a/make-intermediate-ca.sh b/make-intermediate-ca.sh @@ -61,10 +61,6 @@ database = \$dir/index.txt serial = \$dir/serial RANDFILE = \$dir/priv/.rand -# root key and certificate -private_key = \$dir/priv/intermediate.key.pem -certificate = \$dir/cert/intermediate.crt.pem - # certificate revocation list config crlnumber = \$dir/crlnumber crl = \$dir/crl/intermediate.crl.pem @@ -110,10 +106,6 @@ database = \$dir/index.txt serial = \$dir/serial RANDFILE = \$dir/priv/.rand -# root key and certificate -private_key = \$dir/priv/intermediate.key.pem -certificate = \$dir/cert/intermediate.crt.pem - # certificate revocation list config crlnumber = \$dir/crlnumber crl = \$dir/crl/intermediate.crl.pem @@ -152,43 +144,72 @@ cat >>$INTERMEDIATE_CA_ROOT/openssl_usr.cnf < frag.cnf # create the intermediate pair -# generate the key -openssl genrsa -aes256 -out $INTERMEDIATE_CA_ROOT/priv/intermediate.key.pem 4096 -chmod 400 $INTERMEDIATE_CA_ROOT/priv/intermediate.key.pem +# generate keys +openssl genrsa -aes256 \ + -out $INTERMEDIATE_CA_ROOT/priv/intermediate.rsa.key.pem 4096 + +openssl genpkey -aes256 -algorithm EC -pkeyopt ec_paramgen_curve:P-256 \ + -out $INTERMEDIATE_CA_ROOT/priv/intermediate.ecc.key.pem -# generate the certificate +chmod 400 \ + $INTERMEDIATE_CA_ROOT/priv/intermediate.rsa.key.pem \ + $INTERMEDIATE_CA_ROOT/priv/intermediate.ecc.key.pem + +# generate certificates openssl req -config $INTERMEDIATE_CA_ROOT/openssl.cnf \ - -new -subj "/C=$C/ST=$ST/O=$O/CN=$O Intermediate CA" \ - -key $INTERMEDIATE_CA_ROOT/priv/intermediate.key.pem \ - -out $INTERMEDIATE_CA_ROOT/csr/intermediate.csr.pem + -new -subj "/C=$C/ST=$ST/O=$O/CN=$O Intermediate CA (RSA)" \ + -key $INTERMEDIATE_CA_ROOT/priv/intermediate.rsa.key.pem \ + -out $INTERMEDIATE_CA_ROOT/csr/intermediate.rsa.csr.pem openssl ca -config ca/openssl.cnf \ + -cert ca/cert/ca.rsa.crt.pem -keyfile ca/priv/ca.rsa.key.pem \ -days 3650 -notext -extensions v3_intermediate_ca \ - -in $INTERMEDIATE_CA_ROOT/csr/intermediate.csr.pem \ - -out $INTERMEDIATE_CA_ROOT/cert/intermediate.crt.pem + -in $INTERMEDIATE_CA_ROOT/csr/intermediate.rsa.csr.pem \ + -out $INTERMEDIATE_CA_ROOT/cert/intermediate.rsa.crt.pem -chmod 444 $INTERMEDIATE_CA_ROOT/cert/intermediate.crt.pem +openssl req -config $INTERMEDIATE_CA_ROOT/openssl.cnf \ + -new -subj "/C=$C/ST=$ST/O=$O/CN=$O Intermediate CA (ECC)" \ + -key $INTERMEDIATE_CA_ROOT/priv/intermediate.ecc.key.pem \ + -out $INTERMEDIATE_CA_ROOT/csr/intermediate.ecc.csr.pem + +openssl ca -config ca/openssl.cnf \ + -cert ca/cert/ca.ecc.crt.pem -keyfile ca/priv/ca.ecc.key.pem \ + -days 3650 -notext -extensions v3_intermediate_ca \ + -in $INTERMEDIATE_CA_ROOT/csr/intermediate.ecc.csr.pem \ + -out $INTERMEDIATE_CA_ROOT/cert/intermediate.ecc.crt.pem + +chmod 444 \ + $INTERMEDIATE_CA_ROOT/cert/intermediate.rsa.crt.pem \ + $INTERMEDIATE_CA_ROOT/cert/intermediate.ecc.crt.pem # verify the certificate -openssl x509 -noout -text -in $INTERMEDIATE_CA_ROOT/cert/intermediate.crt.pem -openssl verify -CAfile ca/cert/ca.crt.pem $INTERMEDIATE_CA_ROOT/cert/intermediate.crt.pem +openssl x509 -noout -text -in $INTERMEDIATE_CA_ROOT/cert/intermediate.rsa.crt.pem +openssl x509 -noout -text -in $INTERMEDIATE_CA_ROOT/cert/intermediate.ecc.crt.pem + +openssl verify -CAfile ca/cert/ca.rsa.crt.pem $INTERMEDIATE_CA_ROOT/cert/intermediate.rsa.crt.pem +openssl verify -CAfile ca/cert/ca.ecc.crt.pem $INTERMEDIATE_CA_ROOT/cert/intermediate.ecc.crt.pem # create the ocsp pair -openssl genrsa -out $INTERMEDIATE_CA_ROOT/priv/$OCSP_URI.ocsp.key.pem 4096 -chmod 400 $INTERMEDIATE_CA_ROOT/priv/$OCSP_URI.ocsp.key.pem +openssl genpkey -aes256 -algorithm EC -pkeyopt ec_paramgen_curve:P-256 \ + -out $INTERMEDIATE_CA_ROOT/priv/$OCSP_URI.ocsp.ecc.key.pem + +chmod 400 $INTERMEDIATE_CA_ROOT/priv/$OCSP_URI.ocsp.ecc.key.pem openssl req -config $INTERMEDIATE_CA_ROOT/openssl.cnf \ -new -subj="/C=$C/ST=$ST/O=$O/CN=$OCSP_URI" \ - -key "$INTERMEDIATE_CA_ROOT/priv/$OCSP_URI.ocsp.key.pem" \ - -out "$INTERMEDIATE_CA_ROOT/csr/$OCSP_URI.ocsp.csr.pem" + -key "$INTERMEDIATE_CA_ROOT/priv/$OCSP_URI.ocsp.ecc.key.pem" \ + -out "$INTERMEDIATE_CA_ROOT/csr/$OCSP_URI.ocsp.ecc.csr.pem" openssl ca -config $INTERMEDIATE_CA_ROOT/openssl.cnf \ + -cert $INTERMEDIATE_CA_ROOT/cert/intermediate.ecc.crt.pem \ + -keyfile $INTERMEDIATE_CA_ROOT/priv/intermediate.ecc.key.pem \ -days 3650 -notext -extensions ocsp \ - -in "$INTERMEDIATE_CA_ROOT/csr/$OCSP_URI.ocsp.csr.pem" \ - -out "$INTERMEDIATE_CA_ROOT/cert/$OCSP_URI.ocsp.crt.pem" + -in "$INTERMEDIATE_CA_ROOT/csr/$OCSP_URI.ocsp.ecc.csr.pem" \ + -out "$INTERMEDIATE_CA_ROOT/cert/$OCSP_URI.ocsp.ecc.crt.pem" -openssl x509 -noout -text -in "$INTERMEDIATE_CA_ROOT/cert/$OCSP_URI.ocsp.crt.pem" +# cerify the ocsp pair +openssl x509 -noout -text -in "$INTERMEDIATE_CA_ROOT/cert/$OCSP_URI.ocsp.ecc.crt.pem" # create root ca crl @@ -196,13 +217,19 @@ $(dirname $0)/make-ca-crl.sh # create chain of trust -cat $INTERMEDIATE_CA_ROOT/cert/intermediate.crt.pem > $INTERMEDIATE_CA_ROOT/cert/ca-chain.pem +cat ca/cert/ca.rsa.crt.pem $INTERMEDIATE_CA_ROOT/cert/intermediate.rsa.crt.pem \ + ca/cert/ca.ecc.crt.pem $INTERMEDIATE_CA_ROOT/cert/intermediate.ecc.crt.pem \ + > $INTERMEDIATE_CA_ROOT/cert/ca-chain.pem # create symlink ln -sf $DATE ca/intermediate/current -echo "NOTE: Generated CRL is found in '$INTERMEDIATE_CA_ROOT/crl/intermediate.crl.pem'" +echo "NOTE: Generated CRL is found in '$INTERMEDIATE_CA_ROOT/crl/intermediate-$DATE.crl.pem'" echo "NOTE: Please run 'make-ca-crl.sh' on a regular basis (once every 30 days) to update it" -echo "NOTE: OCSP key is found in '$INTERMEDIATE_CA_ROOT/priv/*.ocsp.key.pem'" -echo "NOTE: OCSP cert is found in '$INTERMEDIATE_CA_ROOT/cert/*.ocsp.crt.pem'" +echo "NOTE: Intermediate RSA key is found in '$INTERMEDIATE_CA_ROOT/priv/intermediate.rsa.key.pem'" +echo "NOTE: Intermediate RSA certificate is found in '$INTERMEDIATE_CA_ROOT/cert/intermediate.rsa.crt.pem'" +echo "NOTE: Intermediate ECC key is found in '$INTERMEDIATE_CA_ROOT/priv/intermediate.ecc.key.pem'" +echo "NOTE: Intermediate ECC certificate is found in '$INTERMEDIATE_CA_ROOT/cert/intermediate.ecc.crt.pem'" +echo "NOTE: OCSP key is found in '$INTERMEDIATE_CA_ROOT/priv/*.ocsp.ecc.key.pem'" +echo "NOTE: OCSP cert is found in '$INTERMEDIATE_CA_ROOT/cert/*.ocsp.ecc.crt.pem'" echo "NOTE: Chain of Trust is found in '$INTERMEDIATE_CA_ROOT/cert/ca-chain.pem'" diff --git a/revoke-cert.sh b/revoke-cert.sh @@ -9,6 +9,7 @@ case "$TYPE" in *) echo "Usage: $0 <server|client> <fqdn>" + exit 1 ;; esac @@ -17,5 +18,9 @@ if [ -z "$DOMAIN" ]; then exit 1 fi +set -ex + openssl ca -config ca/intermediate/current/openssl_usr.cnf \ - -revoke "certs/$TYPE/$DOMAIN/$DOMAIN.crt.pem" + -cert ca/intermediate/current/cert/intermediate.ecc.crt.pem \ + -keyfile ca/intermediate/current/priv/intermediate.ecc.key.pem \ + -revoke "certs/$TYPE/$DOMAIN/$DOMAIN".*."crt.pem" diff --git a/revoke-intermediate-ca.sh b/revoke-intermediate-ca.sh @@ -1,8 +1,9 @@ #!/bin/sh -set -x +set -ex openssl ca -config ca/openssl.cnf \ + -cert ca/cert/ca.ecc.crt.pem -keyfile ca/priv/ca.ecc.key.pem \ -revoke $1 $(dirname $0)/make-ca-crl.sh