2 # Author: Jan Vcelak <jvcelak@redhat.com>
8 CERTDB_DIR=/etc/openldap/certs
9 CERT_NAME="OpenLDAP Server"
11 HOSTNAME_FQDN="$(hostname --fqdn)"
17 RANDOM_SOURCE=/dev/urandom
26 printf "usage: generate-server-cert.sh [-d certdb-dir] [-n cert-name]\n" >&2
27 printf " [-p password-file] [-h hostnames]\n" >&2
28 printf " [-a dns-alt-names] [-o]\n" >&2
32 while getopts "d:n:p:h:a:o" opt; do
41 PASSWORD_FILE="$OPTARG"
44 HOSTNAME_FQDN="$OPTARG"
58 [ "$OPTIND" -le "$#" ] && usage
62 ONCE_FILE="$CERTDB_DIR/.slapd-leave"
63 PASSWORD_FILE="${PASSWORD_FILE:-${CERTDB_DIR}/password}"
64 ALT_NAMES="${ALT_NAMES:-${HOSTNAME_FQDN},localhost,localhost.localdomain}"
66 # verify target location
68 if [ "$ONCE" -eq 1 -a -f "$ONCE_FILE" ]; then
69 printf "Skipping certificate generating, '%s' exists.\n" "$ONCE_FILE" >&2
73 if ! certutil -d "$CERTDB_DIR" -U &>/dev/null; then
74 printf "Directory '%s' is not a valid certificate database.\n" "$CERTDB_DIR" >&2
78 printf "Creating new server certificate in '%s'.\n" "$CERTDB_DIR" >&2
80 if [ ! -r "$PASSWORD_FILE" ]; then
81 printf "Password file '%s' is not readable.\n" "$PASSWORD_FILE" >&2
85 if certutil -d "$CERTDB_DIR" -L -a -n "$CERT_NAME" &>/dev/null; then
86 printf "Certificate '%s' already exists in the certificate database.\n" "$CERT_NAME" >&2
90 # generate server certificate (self signed)
93 CERT_RANDOM=$(mktemp --tmpdir=/var/run/openldap)
94 dd if=$RANDOM_SOURCE bs=$CERT_RANDOM_BYTES count=1 of=$CERT_RANDOM &>/dev/null
96 certutil -d "$CERTDB_DIR" -f "$PASSWORD_FILE" -z "$CERT_RANDOM" \
97 -S -x -n "$CERT_NAME" \
98 -s "CN=$HOSTNAME_FQDN" \
100 -k $CERT_KEY_TYPE -g $CERT_KEY_SIZE \
101 -v $CERT_VALID_MONTHS \
109 if [ "$(id -u)" -eq 0 ]; then
110 chgrp ldap "$PASSWORD_FILE"
111 chmod g+r "$PASSWORD_FILE"
113 printf "WARNING: The server requires read permissions on the password file in order to\n" >&2
114 printf " load it's private key from the certificate database.\n" >&2