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.