tstellar / rpms / openldap

Forked from rpms/openldap 3 years ago
Clone
Jan Vcelak a757206
#!/bin/bash
Jan Vcelak a757206
# Author: Jan Vcelak <jvcelak@redhat.com>
Jan Vcelak a757206
Jan Vcelak a757206
set -e
Jan Vcelak a757206
Jan Vcelak a757206
# default options
Jan Vcelak a757206
Jan Vcelak a757206
CERTDB_DIR=/etc/openldap/certs
Jan Vcelak a757206
CERT_NAME="OpenLDAP Server"
Jan Vcelak a757206
PASSWORD_FILE=
Jan Vcelak a757206
HOSTNAME_FQDN="$(hostname --fqdn)"
Jan Vcelak a757206
ALT_NAMES=
Jan Vcelak a757206
ONCE=0
Jan Vcelak a757206
Jan Vcelak a757206
# internals
Jan Vcelak a757206
Jan Vcelak a757206
RANDOM_SOURCE=/dev/urandom
Jan Vcelak a757206
CERT_RANDOM_BYTES=256
Jan Vcelak a757206
CERT_KEY_TYPE=rsa
Jan Vcelak a757206
CERT_KEY_SIZE=1024
Jan Vcelak a757206
CERT_VALID_MONTHS=12
Jan Vcelak a757206
Jan Vcelak a757206
# parse arguments
Jan Vcelak a757206
Jan Vcelak a757206
usage() {
Jan Vcelak a757206
	printf "usage: generate-server-cert.sh [-d certdb-dir] [-n cert-name]\n" >&2
Jan Vcelak a757206
	printf "                               [-p password-file] [-h hostnames]\n" >&2
Jan Vcelak a757206
	pritnf "                               [-a dns-alt-names] [-o]\n" >&2
Jan Vcelak a757206
	exit 1
Jan Vcelak a757206
}
Jan Vcelak a757206
Jan Vcelak a757206
while getopts "d:n:p:h:a:o" opt; do
Jan Vcelak a757206
	case "$opt" in
Jan Vcelak a757206
	d)
Jan Vcelak a757206
		CERTDB_DIR="$OPTARG"
Jan Vcelak a757206
		;;
Jan Vcelak a757206
	n)
Jan Vcelak a757206
		CERT_NAME="$OPTARG"
Jan Vcelak a757206
		;;
Jan Vcelak a757206
	p)
Jan Vcelak a757206
		PASSWORD_FILE="$OPTARG"
Jan Vcelak a757206
		;;
Jan Vcelak a757206
	h)
Jan Vcelak a757206
		HOSTNAME_FQDN="$OPTARG"
Jan Vcelak a757206
		;;
Jan Vcelak a757206
	a)
Jan Vcelak a757206
		ALT_NAMES="$OPTARG"
Jan Vcelak a757206
		;;
Jan Vcelak a757206
	o)
Jan Vcelak a757206
		ONCE=1
Jan Vcelak a757206
		;;
Jan Vcelak a757206
	\?)
Jan Vcelak a757206
		usage
Jan Vcelak a757206
		;;
Jan Vcelak a757206
	esac
Jan Vcelak a757206
done
Jan Vcelak a757206
Jan Vcelak a757206
[ "$OPTIND" -le "$#" ] && usage
Jan Vcelak a757206
Jan Vcelak a757206
# generated options
Jan Vcelak a757206
Jan Vcelak a757206
ONCE_FILE="$CERTDB_DIR/.slapd-leave"
Jan Vcelak a757206
PASSWORD_FILE="${PASSWORD_FILE:-${CERTDB_DIR}/password}"
Jan Vcelak a757206
ALT_NAMES="${ALT_NAMES:-${HOSTNAME_FQDN},localhost,localhost.localdomain}"
Jan Vcelak a757206
Jan Vcelak a757206
# verify target location
Jan Vcelak a757206
Jan Vcelak a757206
if [ "$ONCE" -eq 1 -a -f "$ONCE_FILE" ]; then
Jan Vcelak a757206
	printf "Skipping certificate generating, '%s' exists.\n" "$ONCE_FILE" >&2
Jan Vcelak a757206
	exit 0
Jan Vcelak a757206
fi
Jan Vcelak a757206
Jan Vcelak a757206
if ! certutil -d "$CERTDB_DIR" -U &>/dev/null; then
Jan Vcelak a757206
	printf "Directory '%s' is not a valid certificate database.\n" "$CERTDB_DIR" >&2
Jan Vcelak a757206
	exit 1
Jan Vcelak a757206
fi
Jan Vcelak a757206
Jan Vcelak a757206
printf "Creating new server certificate in '%s'.\n" "$CERTDB_DIR" >&2
Jan Vcelak a757206
Jan Vcelak a757206
if [ ! -r "$PASSWORD_FILE" ]; then
Jan Vcelak a757206
	printf "Password file '%s' is not readable.\n" "$PASSWORD_FILE" >&2
Jan Vcelak a757206
	exit 1
Jan Vcelak a757206
fi
Jan Vcelak a757206
Jan Vcelak a757206
if certutil -d "$CERTDB_DIR" -L -a -n "$CERT_NAME" &>/dev/null; then
Jan Vcelak a757206
	printf "Certificate '%s' already exists in the certificate database.\n" "$CERT_NAME" >&2
Jan Vcelak a757206
	exit 1
Jan Vcelak a757206
fi
Jan Vcelak a757206
Jan Vcelak a757206
# generate server certificate (self signed)
Jan Vcelak a757206
Jan Vcelak a757206
Jan Vcelak 8dc41a3
CERT_RANDOM=$(mktemp --tmpdir=/var/run/openldap)
Jan Vcelak a757206
dd if=$RANDOM_SOURCE bs=$CERT_RANDOM_BYTES count=1 of=$CERT_RANDOM &>/dev/null
Jan Vcelak a757206
Jan Vcelak a757206
certutil -d "$CERTDB_DIR" -f "$PASSWORD_FILE" -z "$CERT_RANDOM" \
Jan Vcelak a757206
	-S -x -n "$CERT_NAME" \
Jan Vcelak a757206
	-s "CN=$HOSTNAME_FQDN" \
Jan Vcelak a757206
	-t TC,, \
Jan Vcelak a757206
	-k $CERT_KEY_TYPE -g $CERT_KEY_SIZE \
Jan Vcelak a757206
	-v $CERT_VALID_MONTHS \
Jan Vcelak a757206
	-8 "$ALT_NAMES" \
Jan Vcelak a757206
	&>/dev/null
Jan Vcelak a757206
Jan Vcelak a757206
rm -f $RANDOM_DATA
Jan Vcelak a757206
Jan Vcelak a757206
# tune permissions
Jan Vcelak a757206
Jan Vcelak a757206
if [ "$(id -u)" -eq 0 ]; then
Jan Vcelak a757206
	chgrp ldap "$PASSWORD_FILE"
Jan Vcelak a757206
	chmod g+r "$PASSWORD_FILE"
Jan Vcelak a757206
else
Jan Vcelak a757206
	printf "WARNING: The server requires read permissions on the password file in order to\n" >&2
Jan Vcelak a757206
	printf "         load it's private key from the certificate database.\n" >&2
Jan Vcelak a757206
fi
Jan Vcelak a757206
Jan Vcelak a757206
touch "$ONCE_FILE"
Jan Vcelak a757206
exit 0