I finally put together a script that gathers some basic information (hostname & SAN’s) and creates a certificate signed against my CA. I’ve got a base myssl.cnf file that ends with
[ req_ext ] subjectAltName = @alt_names [ alt_names ]
The script appends all of the alternate names to the myssl.cnf file.
#!/bin/bash RED_DARK='\033[38;5;196m' GREEN_DARK='\033[38;5;35m' BLUE_DARK='\033[38;5;57m' NC='\033[0m' # Reset function getInput { echo -e "${BLUE_DARK}Please input the short hostname you wish to use (e.g. server123):${NC}" read HOST echo -e "${BLUE_DARK}Please input the domain name you wish to use with this hostname (e.g. rushworth.us):${NC}" read DOMAIN echo -e "${GREEN_DARK}Please enter any SAN values for this certificate, separated by spaces (must be fully qualified):${NC}" read SANS FQHOST="${HOST}.${DOMAIN}" echo -e "Short hostname: $HOST" echo -e "Fully qualified hostname: $FQHOST" echo -e "SAN: $SANS" echo -e "${RED_DARK}Is this correct? (Y/N):${NC}" read boolCorrect if [ $boolCorrect == 'Y' ] || [ $boolCorrect == 'y' ] then mkdir $HOST echo $HOST cp myssl.cnf "./$HOST/myssl.cnf" cd "./$HOST" echo "The following SANs will be used on this certificate: " echo "DNS.1 = ${FQHOST}" echo "DNS.1 = ${FQHOST}" >> ./myssl.cnf echo "DNS.2 = ${HOST}" echo "DNS.2 = ${HOST}" >> ./myssl.cnf if [ -n "$SANS" ] then SANARRAY=( $SANS ) iSANCounter=2 for SANITEM in "${SANARRAY[@]}" ; do let iSANCounter=iSANCounter+1 echo "DNS.${iSANCounter} = ${SANITEM}" echo "DNS.${iSANCounter} = ${SANITEM}" >> ./myssl.cnf done fi export strCertKeyPassword=Wh1t2v2rP144w9rd export strPFXPassword=123abc456 openssl genrsa -passout env:strCertKeyPassword -aes256 -out $FQHOST.passwd.key 2048 openssl req -new -key $FQHOST.passwd.key -passin env:strCertKeyPassword -config ./myssl.cnf -reqexts req_ext -out $FQHOST.csr -subj "/C=US/ST=Ohio/L=Cleveland/O=Rushworth/OU=Home/CN=$FQHOST" openssl x509 -req -in $FQHOST.csr -passin env:strCertKeyPassword -extensions req_ext -extfile ./myssl.cnf -out $FQHOST.cer -days 365 -CA /ca/ca.cer -CAkey /ca/ca.key -sha256 openssl rsa -in $FQHOST.passwd.key -out $FQHOST.key -passin pass:$strCertKeyPassword -passin env:strCertKeyPassword openssl pkcs12 -export -out $FQHOST.pfx -inkey $FQHOST.key -in $FQHOST.cer -passout env:strPFXPassword else getInput fi } getInput
There’s an encrypted private key and a non-encrypted private key. Because I have some Windows servers — Exchange and Active Directory — I create a PFX file too.