#!/bin/sh # Script for generating RSA and ECC Intermediate CA and server/client certs based on it. # Result is chains that looks like: # RSA Server # ROOT: ./certs/ca-cert.pem # C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com) # INTERMEDIATE: ./certs/intermediate/ca-int-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com # INTERMEDIATE2: ./certs/intermediate/ca-int2-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA/emailAddress=info@wolfssl.com # SERVER: ./certs/intermediate/server-int-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain/emailAddress=info@wolfssl.com # RSA Client # ROOT: ./certs/ca-cert.pem # C=US, ST=Montana, L=Bozeman, O=Sawtooth, OU=Consulting, CN=www.wolfssl.com/emailAddress=info@wolfssl.com) # INTERMEDIATE: ./certs/intermediate/ca-int-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA/emailAddress=info@wolfssl.com # INTERMEDIATE: ./certs/intermediate/ca-int2-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA/emailAddress=info@wolfssl.com # CLIENT: ./certs/intermediate/client-int-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain/emailAddress=info@wolfssl.com # ECC Server # ROOT: ./certs/ca-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com # INTERMEDIATE: ./certs/intermediate/ca-int-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com # INTERMEDIATE2: ./certs/intermediate/ca-int-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA ECC/emailAddress=info@wolfssl.com # SERVER: ./certs/intermediate/server-int-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Server Chain ECC/emailAddress=info@wolfssl.com # ECC Client # ROOT: ./certs/ca-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=www.wolfssl.com/emailAddress=info@wolfssl.com # INTERMEDIATE: ./certs/intermediate/ca-int-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate CA ECC/emailAddress=info@wolfssl.com # INTERMEDIATE2: ./certs/intermediate/ca-int2-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Intermediate2 CA ECC/emailAddress=info@wolfssl.com # CLIENT: ./certs/intermediate/client-int-ecc-cert.pem # C=US, ST=Washington, L=Seattle, O=wolfSSL, OU=Development, CN=wolfSSL Client Chain ECC/emailAddress=info@wolfssl.com # Run from wolfssl-root as `./certs/intermediate/genintcerts.sh` # To cleanup temp files use `./certs/intermediate/genintcerts.sh clean` # To cleanup all files use `./certs/intermediate/genintcerts.sh cleanall` dir="." cleanup_files(){ rm -f ./certs/intermediate/index.* rm -f ./certs/intermediate/*.old rm -f ./certs/intermediate/serial rm -f ./certs/intermediate/crlnumber rm -f ./certs/intermediate/*.cnf rm -rf ./certs/intermediate/new_certs exit 0 } check_result() { if [ $1 -ne 0 ]; then echo "Step Failed, Abort" exit 1 else echo "Step Succeeded!" fi } # Args: 1=CnfFile, 2=Key, 3=Cert create_ca_config() { echo "# Generated openssl conf" > "$1" echo "[ ca ]" >> "$1" echo "default_ca = CA_default" >> "$1" echo "" >> "$1" echo "[ CA_default ]" >> "$1" echo "certs = $dir/certs/intermediate" >> "$1" echo "new_certs_dir = $dir/certs/intermediate/new_certs">> "$1" echo "database = $dir/certs/intermediate/index.txt">> "$1" echo "serial = $dir/certs/intermediate/serial" >> "$1" echo "RANDFILE = $dir/private/.rand" >> "$1" echo "" >> "$1" echo "private_key = $dir/$2" >> "$1" echo "certificate = $dir/$3" >> "$1" echo "" >> "$1" echo "crlnumber = $dir/certs/intermediate/crlnumber">> "$1" echo "crl_extensions = crl_ext" >> "$1" echo "default_crl_days = 1000" >> "$1" echo "default_md = sha256" >> "$1" echo "" >> "$1" echo "name_opt = ca_default" >> "$1" echo "cert_opt = ca_default" >> "$1" echo "default_days = 3650" >> "$1" echo "preserve = no" >> "$1" echo "policy = policy_loose" >> "$1" echo "" >> "$1" echo "[ policy_strict ]" >> "$1" echo "countryName = match" >> "$1" echo "stateOrProvinceName = match" >> "$1" echo "organizationName = match" >> "$1" echo "organizationalUnitName = optional" >> "$1" echo "commonName = supplied" >> "$1" echo "emailAddress = optional" >> "$1" echo "" >> "$1" echo "[ policy_loose ]" >> "$1" echo "countryName = optional" >> "$1" echo "stateOrProvinceName = optional" >> "$1" echo "localityName = optional" >> "$1" echo "organizationName = optional" >> "$1" echo "organizationalUnitName = optional" >> "$1" echo "commonName = supplied" >> "$1" echo "emailAddress = optional" >> "$1" echo "" >> "$1" echo "[ req ]" >> "$1" echo "default_bits = 2048" >> "$1" echo "distinguished_name = req_distinguished_name" >> "$1" echo "string_mask = utf8only" >> "$1" echo "default_md = sha256" >> "$1" echo "x509_extensions = v3_ca" >> "$1" echo "" >> "$1" echo "[ req_distinguished_name ]" >> "$1" echo "countryName = US" >> "$1" echo "stateOrProvinceName = Washington" >> "$1" echo "localityName = Seattle" >> "$1" echo "organizationName = wolfSSL" >> "$1" echo "organizationalUnitName = Development" >> "$1" echo "commonName = www.wolfssl.com" >> "$1" echo "emailAddress = info@wolfssl.com" >> "$1" echo "" >> "$1" echo "[ v3_ca ]" >> "$1" echo "subjectKeyIdentifier = hash" >> "$1" echo "authorityKeyIdentifier = keyid:always,issuer" >> "$1" echo "basicConstraints = critical, CA:true" >> "$1" echo "keyUsage = critical, digitalSignature, cRLSign, keyCertSign">> "$1" echo "" >> "$1" echo "[ v3_intermediate_ca ]" >> "$1" echo "subjectKeyIdentifier = hash" >> "$1" echo "authorityKeyIdentifier = keyid:always,issuer" >> "$1" echo "basicConstraints = critical, CA:true, pathlen:1" >> "$1" echo "keyUsage = critical, digitalSignature, cRLSign, keyCertSign">> "$1" echo "" >> "$1" echo "[ v3_intermediate2_ca ]" >> "$1" echo "subjectKeyIdentifier = hash" >> "$1" echo "authorityKeyIdentifier = keyid:always,issuer" >> "$1" echo "basicConstraints = critical, CA:true, pathlen:1" >> "$1" echo "keyUsage = critical, digitalSignature, cRLSign, keyCertSign">> "$1" echo "" >> "$1" echo "[ usr_cert ]" >> "$1" echo "basicConstraints = CA:FALSE" >> "$1" echo "nsCertType = client, email" >> "$1" echo "subjectKeyIdentifier = hash" >> "$1" echo "authorityKeyIdentifier = keyid,issuer" >> "$1" echo "keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment">> "$1" echo "extendedKeyUsage = clientAuth, emailProtection" >> "$1" echo "" >> "$1" echo "[ server_cert ]" >> "$1" echo "basicConstraints = CA:FALSE" >> "$1" echo "nsCertType = server" >> "$1" echo "subjectKeyIdentifier = hash" >> "$1" echo "authorityKeyIdentifier = keyid,issuer:always" >> "$1" echo "keyUsage = critical, digitalSignature, keyEncipherment, keyAgreement">> "$1" echo "extendedKeyUsage = serverAuth" >> "$1" echo "" >> "$1" echo "[ crl_ext ]" >> "$1" echo "authorityKeyIdentifier=keyid:always" >> "$1" } # Args: 1=reqcnf, 2=signcnf, 3=keyfile, 4=certfile, 5=ext, 6=subj, 7=days create_cert() { openssl req -config ./certs/intermediate/$1.cnf -new -sha256 \ -key $3 \ -out ./certs/intermediate/tmp.csr \ -subj "/C=US/ST=Washington/L=Seattle/O=wolfSSL/OU=Development/CN=$6/emailAddress=info@wolfssl.com" check_result $? openssl ca -config ./certs/intermediate/$2.cnf -extensions $5 -days $7 -notext -md sha256 \ -in ./certs/intermediate/tmp.csr -out ./certs/intermediate/$4.pem -batch check_result $? rm ./certs/intermediate/tmp.csr # Convert Cert to DER openssl x509 -in ./certs/intermediate/$4.pem -inform PEM -out ./certs/intermediate/$4.der -outform DER check_result $? # Add text to cert PEM file openssl x509 -in ./certs/intermediate/$4.pem -text > ./certs/intermediate/tmp.pem check_result $? mv ./certs/intermediate/tmp.pem ./certs/intermediate/$4.pem } if [ "$1" = "clean" ]; then echo "Cleaning temp files" cleanup_files fi if [ "$1" = "cleanall" ]; then echo "Cleaning all files" rm -f ./certs/intermediate/*.pem rm -f ./certs/intermediate/*.der rm -f ./certs/intermediate/*.csr cleanup_files fi # Make sure required CA files exist and are populated rm -f ./certs/intermediate/index.* touch ./certs/intermediate/index.txt if [ ! -f ./certs/intermediate/serial ]; then echo 1000 > ./certs/intermediate/serial fi if [ ! -f ./certs/intermediate/crlnumber ]; then echo 2000 > ./certs/intermediate/crlnumber fi if [ ! -d ./certs/intermediate/new_certs ]; then mkdir ./certs/intermediate/new_certs fi # RSA echo "Creating RSA CA configuration cnf files" create_ca_config ./certs/intermediate/wolfssl_root.cnf certs/ca-key.pem certs/ca-cert.pem create_ca_config ./certs/intermediate/wolfssl_int.cnf certs/intermediate/ca-int-key.pem certs/intermediate/ca-int-cert.pem create_ca_config ./certs/intermediate/wolfssl_int2.cnf certs/intermediate/ca-int2-key.pem certs/intermediate/ca-int2-cert.pem if [ ! -f ./certs/intermediate/ca-int-key.pem ]; then echo "Make Intermediate RSA CA Key" openssl genrsa -out ./certs/intermediate/ca-int-key.pem 2048 check_result $? openssl rsa -in ./certs/intermediate/ca-int-key.pem -inform PEM -out ./certs/intermediate/ca-int-key.der -outform DER check_result $? fi if [ ! -f ./certs/intermediate/ca-int2-key.pem ]; then echo "Make Intermediate2 RSA CA Key" openssl genrsa -out ./certs/intermediate/ca-int2-key.pem 2048 check_result $? openssl rsa -in ./certs/intermediate/ca-int2-key.pem -inform PEM -out ./certs/intermediate/ca-int2-key.der -outform DER check_result $? fi echo "Create RSA Intermediate CA signed by root" create_cert wolfssl_int wolfssl_root ./certs/intermediate/ca-int-key.pem ca-int-cert v3_intermediate_ca "wolfSSL Intermediate CA" 7300 echo "Create RSA Intermediate2 CA signed by RSA Intermediate" create_cert wolfssl_int2 wolfssl_int ./certs/intermediate/ca-int2-key.pem ca-int2-cert v3_intermediate2_ca "wolfSSL Intermediate2 CA" 7300 echo "Create RSA Server Certificate signed by intermediate2" create_cert wolfssl_int2 wolfssl_int2 ./certs/server-key.pem server-int-cert server_cert "wolfSSL Server Chain" 3650 echo "Create RSA Client Certificate signed by intermediate2" create_cert wolfssl_int2 wolfssl_int2 ./certs/client-key.pem client-int-cert usr_cert "wolfSSL Client Chain" 3650 echo "Generate CRLs for new certificates" openssl ca -config ./certs/intermediate/wolfssl_root.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int.pem -keyfile ./certs/intermediate/ca-int-key.pem -cert ./certs/intermediate/ca-int-cert.pem check_result $? openssl ca -config ./certs/intermediate/wolfssl_int.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int2.pem -keyfile ./certs/intermediate/ca-int2-key.pem -cert ./certs/intermediate/ca-int2-cert.pem check_result $? openssl ca -config ./certs/intermediate/wolfssl_int2.cnf -gencrl -crldays 1000 -out ./certs/crl/server-int.pem -keyfile ./certs/server-key.pem -cert ./certs/intermediate/server-int-cert.pem check_result $? openssl ca -config ./certs/intermediate/wolfssl_int2.cnf -gencrl -crldays 1000 -out ./certs/crl/client-int.pem -keyfile ./certs/client-key.pem -cert ./certs/intermediate/client-int-cert.pem check_result $? echo "Assemble test chains - peer first, then intermediate2, then intermediate" openssl x509 -in ./certs/intermediate/server-int-cert.pem > ./certs/intermediate/server-chain.pem openssl x509 -in ./certs/intermediate/ca-int2-cert.pem >> ./certs/intermediate/server-chain.pem openssl x509 -in ./certs/intermediate/ca-int-cert.pem >> ./certs/intermediate/server-chain.pem cat ./certs/intermediate/server-int-cert.der ./certs/intermediate/ca-int2-cert.der ./certs/intermediate/ca-int-cert.der > ./certs/intermediate/server-chain.der openssl x509 -in ./certs/intermediate/client-int-cert.pem > ./certs/intermediate/client-chain.pem openssl x509 -in ./certs/intermediate/ca-int2-cert.pem >> ./certs/intermediate/client-chain.pem openssl x509 -in ./certs/intermediate/ca-int-cert.pem >> ./certs/intermediate/client-chain.pem cat ./certs/intermediate/client-int-cert.der ./certs/intermediate/ca-int2-cert.der ./certs/intermediate/ca-int-cert.der > ./certs/intermediate/client-chain.der echo "Assemble cert chain with extra cert for testing alternate chains" cp ./certs/intermediate/server-chain.pem ./certs/intermediate/server-chain-alt.pem cp ./certs/intermediate/client-chain.pem ./certs/intermediate/client-chain-alt.pem openssl x509 -in ./certs/external/ca-google-root.pem >> ./certs/intermediate/server-chain-alt.pem openssl x509 -in ./certs/external/ca-google-root.pem >> ./certs/intermediate/client-chain-alt.pem # ECC echo "Creating ECC CA configuration cnf files" create_ca_config ./certs/intermediate/wolfssl_root_ecc.cnf certs/ca-ecc-key.pem certs/ca-ecc-cert.pem create_ca_config ./certs/intermediate/wolfssl_int_ecc.cnf certs/intermediate/ca-int-ecc-key.pem certs/intermediate/ca-int-ecc-cert.pem create_ca_config ./certs/intermediate/wolfssl_int2_ecc.cnf certs/intermediate/ca-int2-ecc-key.pem certs/intermediate/ca-int2-ecc-cert.pem if [ ! -f ./certs/intermediate/ca-int-ecc-key.pem ]; then echo "Make Intermediate ECC CA Key" openssl ecparam -name prime256v1 -genkey -noout -out ./certs/intermediate/ca-int-ecc-key.pem check_result $? openssl ec -in ./certs/intermediate/ca-int-ecc-key.pem -inform PEM -out ./certs/intermediate/ca-int-ecc-key.der -outform DER check_result $? fi if [ ! -f ./certs/intermediate/ca-int2-ecc-key.pem ]; then echo "Make Intermediate2 ECC CA Key" openssl ecparam -name prime256v1 -genkey -noout -out ./certs/intermediate/ca-int2-ecc-key.pem check_result $? openssl ec -in ./certs/intermediate/ca-int2-ecc-key.pem -inform PEM -out ./certs/intermediate/ca-int2-ecc-key.der -outform DER check_result $? fi echo "Create ECC Intermediate CA signed by root" create_cert wolfssl_int_ecc wolfssl_root_ecc ./certs/intermediate/ca-int-ecc-key.pem ca-int-ecc-cert v3_intermediate_ca "wolfSSL Intermediate CA ECC" 7300 echo "Create ECC Intermediate2 CA signed by Intermediate" create_cert wolfssl_int2_ecc wolfssl_int_ecc ./certs/intermediate/ca-int2-ecc-key.pem ca-int2-ecc-cert v3_intermediate2_ca "wolfSSL Intermediate2 CA ECC" 7300 echo "Create ECC Server Certificate signed by intermediate2" create_cert wolfssl_int2_ecc wolfssl_int2_ecc ./certs/ecc-key.pem server-int-ecc-cert server_cert "wolfSSL Server Chain ECC" 3650 echo "Create ECC Client Certificate signed by intermediate2" create_cert wolfssl_int2_ecc wolfssl_int2_ecc ./certs/ecc-client-key.pem client-int-ecc-cert usr_cert "wolfSSL Client Chain ECC" 3650 echo "Generate CRLs for new certificates" openssl ca -config ./certs/intermediate/wolfssl_root_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int-ecc.pem -keyfile ./certs/intermediate/ca-int-ecc-key.pem -cert ./certs/intermediate/ca-int-ecc-cert.pem check_result $? openssl ca -config ./certs/intermediate/wolfssl_int_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/ca-int2-ecc.pem -keyfile ./certs/intermediate/ca-int2-ecc-key.pem -cert ./certs/intermediate/ca-int2-ecc-cert.pem check_result $? openssl ca -config ./certs/intermediate/wolfssl_int2_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/server-int-ecc.pem -keyfile ./certs/ecc-key.pem -cert ./certs/intermediate/server-int-ecc-cert.pem check_result $? openssl ca -config ./certs/intermediate/wolfssl_int2_ecc.cnf -gencrl -crldays 1000 -out ./certs/crl/client-int-ecc.pem -keyfile ./certs/ecc-client-key.pem -cert ./certs/intermediate/client-int-ecc-cert.pem check_result $? echo "Assemble test chains - peer first, then intermediate2, then intermediate" openssl x509 -in ./certs/intermediate/server-int-ecc-cert.pem > ./certs/intermediate/server-chain-ecc.pem openssl x509 -in ./certs/intermediate/ca-int2-ecc-cert.pem >> ./certs/intermediate/server-chain-ecc.pem openssl x509 -in ./certs/intermediate/ca-int-ecc-cert.pem >> ./certs/intermediate/server-chain-ecc.pem cat ./certs/intermediate/server-int-ecc-cert.der ./certs/intermediate/ca-int2-ecc-cert.der ./certs/intermediate/ca-int-ecc-cert.der > ./certs/intermediate/server-chain-ecc.der openssl x509 -in ./certs/intermediate/client-int-ecc-cert.pem > ./certs/intermediate/client-chain-ecc.pem openssl x509 -in ./certs/intermediate/ca-int2-ecc-cert.pem >> ./certs/intermediate/client-chain-ecc.pem openssl x509 -in ./certs/intermediate/ca-int-ecc-cert.pem >> ./certs/intermediate/client-chain-ecc.pem cat ./certs/intermediate/client-int-ecc-cert.der ./certs/intermediate/ca-int2-ecc-cert.der ./certs/intermediate/ca-int-ecc-cert.der > ./certs/intermediate/client-chain-ecc.der echo "Assemble cert chain with extra untrusted cert for testing alternate chains" cp ./certs/intermediate/server-chain-ecc.pem ./certs/intermediate/server-chain-alt-ecc.pem cp ./certs/intermediate/client-chain-ecc.pem ./certs/intermediate/client-chain-alt-ecc.pem openssl x509 -in ./certs/external/ca-google-root.pem >> ./certs/intermediate/server-chain-alt-ecc.pem openssl x509 -in ./certs/external/ca-google-root.pem >> ./certs/intermediate/client-chain-alt-ecc.pem