Script pour la gestion d'un PKI avec CA.pl
This commit is contained in:
parent
e6fda335f9
commit
5a36e39c29
190
ssl/issue_certificate.sh
Executable file
190
ssl/issue_certificate.sh
Executable file
@ -0,0 +1,190 @@
|
||||
#!/bin/bash
|
||||
|
||||
#
|
||||
# requires CA.pl from OpenSSL: https://github.com/openssl/openssl/blob/master/apps/CA.pl.in
|
||||
#
|
||||
# generating CA.pl from OpenSSL source:
|
||||
# /usr/bin/perl "-I." -Mconfigdata "util/dofile.pl" \
|
||||
# "-oMakefile" apps/CA.pl.in > "apps/CA.pl"
|
||||
# sudo cp apps/CA.pl /usr/local/bin
|
||||
#
|
||||
# This script requires that a CA certificate has already been created and
|
||||
# that the CA private key passphrase can be found in $CA_ROOT/cacert.pass
|
||||
#
|
||||
# NB: OpenSSL doesn't handle concurrent access to the CA database.
|
||||
# Wrap this script with flock command or use some other method to serialize access.
|
||||
#
|
||||
|
||||
CAPL_ORIG=/usr/lib/ssl/misc/CA.pl
|
||||
OPENSSL=/usr/bin/openssl
|
||||
|
||||
function display_help() {
|
||||
echo "${0} Usage :"
|
||||
echo -e "\t--country\tSpecify the Country of the certificate"
|
||||
echo -e "\t--cadir\t\tSpecify the CA directory"
|
||||
echo -e "\t--cn\t\tSpecify the CN of the certificate"
|
||||
echo -e "\t--locality\tSpecify the Locality of the certificate"
|
||||
echo -e "\t--mail\t\tSpecify the Mail of the certificate"
|
||||
echo -e "\t--organization\tSpecify the Organization of the certificate"
|
||||
echo -e "\t--st\t\tSpecify the State or Province of the certificate"
|
||||
echo -e "\t--days\t\tSpecify the validty of the certificate in days (default 1095)"
|
||||
echo -e "\t--newca\t\tGenerate a new Certificate Authority. Can't use with --newcert"
|
||||
echo -e "\t--newcert\tGenerate a new Certificate. Can't use with --newca"
|
||||
echo -e "\t--updateca\tAdd certificate or CA to update-ca-certificates"
|
||||
echo -e "\t--genpub\t\tGenerate Public key of the certificate"
|
||||
echo -e "\t-h or --help\tThis help"
|
||||
echo ""
|
||||
echo "Examples :"
|
||||
echo "./issue_certificate.sh --newca --cadir /tmp/cademo --country FR --cn \"BLORAND Test CA\" --locality DINAN --mail webmaster@blorand.org --organization BLORAND --st BRETAGNE --days \$((365 * 30)) --updatca"
|
||||
echo "./issue_certificate.sh --newcert --cadir /tmp/cademo --country FR --cn benoit.blorand.local --locality DINAN --mail webmaster@blorand.org --organization BLORAND --st BRETAGNE --days \$((365 * 30)) --genpub"
|
||||
}
|
||||
|
||||
GET_OPT=`getopt -o h --long help,country:,cadir:,cn:,locality:,mail:,organization:,st:,days:,newca,newcert,updateca,genpub -n "$0 parameters" -- "$@"`
|
||||
if [ ! "${?}" == "0" ] ; then
|
||||
display_help
|
||||
exit 1
|
||||
fi
|
||||
eval set -- "$GET_OPT"
|
||||
while true ; do
|
||||
case ${1} in
|
||||
--country)
|
||||
CERT_COUNTRY="${2}"
|
||||
shift 2
|
||||
;;
|
||||
--cadir)
|
||||
CADIR=/tmp/demoCA
|
||||
shift 2
|
||||
;;
|
||||
--cn)
|
||||
CERT_CN="${2}"
|
||||
shift 2
|
||||
;;
|
||||
--locality)
|
||||
CERT_LOCALITY="${2}"
|
||||
shift 2
|
||||
;;
|
||||
--mail)
|
||||
CERT_MAIL="${2}"
|
||||
shift 2
|
||||
;;
|
||||
--organization)
|
||||
CERT_ORGANIZATION="${2}"
|
||||
shift 2
|
||||
;;
|
||||
--st)
|
||||
CERT_ST="${2}"
|
||||
shift 2
|
||||
;;
|
||||
--days)
|
||||
CERT_DAYS="-days ${2}"
|
||||
shift 2
|
||||
;;
|
||||
--newca)
|
||||
NEWCA=1
|
||||
shift
|
||||
;;
|
||||
--newcert)
|
||||
NEWCERT=1
|
||||
shift
|
||||
;;
|
||||
--updateca)
|
||||
UPDATECA=1
|
||||
shift
|
||||
;;
|
||||
--genpub)
|
||||
GENPUB=1
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
display_help
|
||||
exit 0
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
display_help >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ ! -z "${NEWCA}" -a ! -z "${NEWCERT}" ] ; then
|
||||
echo "Only one of --newca or --newcert is possible" >&2
|
||||
display_help >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "${CERT_COUNTRY}" -o -z "${CERT_CN}" -o -z "${CERT_LOCALITY}" -o -z "${CERT_MAIL}" -o -z "${CERT_ORGANIZATION}" -o -z "${CERT_ST}" ] ; then
|
||||
echo "Almost one of --country --cadir --cn --locality --mail --organization --st is missing..." >&2
|
||||
display_help >&2
|
||||
exit 1
|
||||
fi
|
||||
CERT_BASE=${CADIR}/certs
|
||||
|
||||
if [ ! -z "${NEWCA}" ] ; then
|
||||
if [ ! -d "${CADIR}" -o ! -f "${CADIR}/serial" ]; then
|
||||
echo "No Certificate Authority Root found in current directory."
|
||||
if [ -d "$CADIR" ]; then
|
||||
rm -r ${CADIR}-backup > /dev/null 2>&1
|
||||
mv $CADIR ${CADIR}-backup
|
||||
fi
|
||||
mkdir -p "${CADIR}"
|
||||
sed "s@\./demoCA@${CADIR}@g" /etc/ssl/openssl.cnf > "${CADIR}/openssl.cnf"
|
||||
CAPL="${CADIR}/CA.pl"
|
||||
sed "s@\./demoCA@${CADIR}@g" ${CAPL_ORIG} > ${CAPL}
|
||||
chmod +x ${CAPL}
|
||||
ORIG_UMASK=`umask`
|
||||
umask 0077
|
||||
pass=`openssl rand -base64 18 | tee "${CADIR}/cacert.pass"`
|
||||
umask ${ORIG_UMASK}
|
||||
SUBJECT="/C=${CERT_COUNTRY}/L=${CERT_LOCALITY}/ST=${CERT_ST}/O=${CERT_ORGANIZATION}/CN=${CERT_CN}/emailAddress=${CERT_MAIL}"
|
||||
echo "" | OPENSSL_CONFIG="-config '${CADIR}/openssl.cnf'" OPENSSL=${OPENSSL} ${CAPL} -newca -extra-req "-passout file:'${CADIR}/cacert.pass' -subj '${SUBJECT}' ${CERT_DAYS} -batch" -extra-ca "-passin file:'${CADIR}/cacert.pass' ${CERT_DAYS} -batch"
|
||||
if [ ! -z "${UPDATECA}" ] ; then
|
||||
mkdir -p /usr/local/share/ca-certificates/extra
|
||||
ln -s ${CADIR}/cacert.pem "/usr/local/share/ca-certificates/extra/${CERT_CN}.crt"
|
||||
/usr/sbin/update-ca-certificates
|
||||
fi
|
||||
else
|
||||
echo "There is already a $CADIR folder !"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -z "${NEWCERT}" ]; then
|
||||
CAPL="${CADIR}/CA.pl"
|
||||
if [ ! -e "${CADIR}/certs/${CERT_CN}.pem" ] ; then
|
||||
|
||||
pass=`openssl rand -base64 18 | tee "${CADIR}/certs/${CERT_CN}.pass"`
|
||||
echo "issuing certificate for ${CERT_CN}"
|
||||
|
||||
# create certificate request
|
||||
SUBJECT="/C=${CERT_COUNTRY}/L=${CERT_LOCALITY}/ST=${CERT_ST}/O=${CERT_ORGANIZATION}/CN=${CERT_CN}/emailAddress=${CERT_MAIL}"
|
||||
OPENSSL_CONFIG="-config '${CADIR}/openssl.cnf'" OPENSSL=${OPENSSL} ${CAPL} -newreq -extra-req "-passout file:'${CADIR}/certs/${CERT_CN}.pass' -subj '${SUBJECT}' ${CERT_DAYS} -batch"
|
||||
|
||||
# sign certificate request
|
||||
OPENSSL_CONFIG="-config '${CADIR}/openssl.cnf'" OPENSSL=${OPENSSL} ${CAPL} -sign -extra-ca "-passin file:'${CADIR}/cacert.pass' ${CERT_DAYS} -batch"
|
||||
if [ "$?" -ne 0 ]; then
|
||||
echo "FATAL: failed to sign, aborting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
cat newkey.pem newcert.pem > "${CADIR}/certs/${CERT_CN}.pem"
|
||||
chmod 600 "${CADIR}/certs/${CERT_CN}.pem"
|
||||
rm newkey.pem newcert.pem newreq.pem
|
||||
|
||||
if [ ! -z "${GENPUB}" ] ; then
|
||||
OPENSSL_CONFIG="-config '${CADIR}/openssl.cnf'" ${OPENSSL} rsa -in "${CADIR}/certs/${CERT_CN}.pem" -out "${CADIR}/certs/${CERT_CN}-public.pem" -outform PEM -pubout -passin file:"${CADIR}/certs/${CERT_CN}.pass"
|
||||
fi
|
||||
else
|
||||
echo "Certificate '${CADIR}/${CERT_CN}.pem' already exist"
|
||||
echo "Can't continue"
|
||||
exit 1
|
||||
fi
|
||||
exit 0
|
||||
fi
|
||||
|
||||
exit 0
|
||||
|
Loading…
Reference in New Issue
Block a user