Home | History | Annotate | Line # | Download | only in scripts
      1 #! /bin/sh
      2 # $OpenLDAP$
      3 ## This work is part of OpenLDAP Software <http://www.openldap.org/>.
      4 ##
      5 ## Copyright 1998-2024 The OpenLDAP Foundation.
      6 ## All rights reserved.
      7 ##
      8 ## Redistribution and use in source and binary forms, with or without
      9 ## modification, are permitted only as authorized by the OpenLDAP
     10 ## Public License.
     11 ##
     12 ## A copy of this license is available in the file LICENSE in the
     13 ## top-level directory of the distribution or, alternatively, at
     14 ## <http://www.OpenLDAP.org/license.html>.
     15 
     16 echo "running defines.sh"
     17 . $SRCDIR/scripts/defines.sh
     18 
     19 if test $AUTOCA = autocano; then 
     20 	echo "Automatic CA overlay not available, test skipped"
     21 	exit 0
     22 fi 
     23 
     24 if test $BACKEND = ldif ; then
     25 	# autoca tries to modify an entry in a search response,
     26 	# which deadlocks because the tree is readlocked by the search.
     27 	echo "Test does not support $BACKEND backend, test skipped"
     28 	exit 0
     29 fi
     30 
     31 CFDIR=$TESTDIR/slapd.d
     32 
     33 mkdir -p $TESTDIR $CFDIR $DBDIR1
     34 
     35 $SLAPPASSWD -g -n >$CONFIGPWF
     36 
     37 #
     38 # Test operation of autoca:
     39 # - configure over ldap without TLS
     40 # - populate over ldap
     41 # - add host entry
     42 # - add autoca overlay
     43 # - generate server and user certs
     44 # - check for TLS operation
     45 #
     46 
     47 echo "Starting slapd on TCP/IP port $PORT1..."
     48 . $CONFFILTER $BACKEND < $DYNAMICCONF > $CONFLDIF
     49 $SLAPADD -F $CFDIR -n 0 -l $CONFLDIF
     50 RC=$?
     51 if test $RC != 0 ; then
     52 	echo "slapadd failed ($RC)!"
     53 	exit $RC
     54 fi
     55 
     56 $SLAPD -F $CFDIR -h $URIP1 -d $LVL > $LOG1 2>&1 &
     57 PID=$!
     58 if test $WAIT != 0 ; then
     59     echo PID $PID
     60     read foo
     61 fi
     62 KILLPIDS="$PID"
     63 cd $TESTWD
     64 
     65 sleep 1
     66 
     67 echo "Using ldapsearch to check that slapd is running..."
     68 for i in 0 1 2 3 4 5; do
     69 	$LDAPSEARCH -s base -b "" -H $URIP1 \
     70 		'objectclass=*' > /dev/null 2>&1
     71 	RC=$?
     72 	if test $RC = 0 ; then
     73 		break
     74 	fi
     75 	echo "Waiting 5 seconds for slapd to start..."
     76 	sleep 5
     77 done
     78 
     79 if test $RC != 0 ; then
     80 	echo "ldapsearch failed ($RC)!"
     81 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
     82 	exit $RC
     83 fi
     84 
     85 echo "Adding schema and databases on slapd..."
     86 $LDAPADD -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
     87 include: file://$ABS_SCHEMADIR/core.ldif
     88 
     89 include: file://$ABS_SCHEMADIR/cosine.ldif
     90 
     91 include: file://$ABS_SCHEMADIR/inetorgperson.ldif
     92 
     93 include: file://$ABS_SCHEMADIR/openldap.ldif
     94 
     95 include: file://$ABS_SCHEMADIR/nis.ldif
     96 EOF
     97 RC=$?
     98 if test $RC != 0 ; then
     99 	echo "ldapadd failed for schema config ($RC)!"
    100 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    101 	exit $RC
    102 fi
    103 
    104 nullExclude="" nullOK=""
    105 test $BACKEND = null && nullExclude="# " nullOK="OK"
    106 
    107 if [ "$BACKENDTYPE" = mod ]; then
    108 	$LDAPADD -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
    109 dn: cn=module,cn=config
    110 objectClass: olcModuleList
    111 cn: module
    112 olcModulePath: $TESTWD/../servers/slapd/back-$BACKEND
    113 olcModuleLoad: back_$BACKEND.la
    114 EOF
    115 	RC=$?
    116 	if test $RC != 0 ; then
    117 		echo "ldapadd failed for backend config ($RC)!"
    118 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    119 		exit $RC
    120 	fi
    121 fi
    122 
    123 $LDAPADD -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
    124 dn: olcDatabase={1}$BACKEND,cn=config
    125 objectClass: olcDatabaseConfig
    126 ${nullExclude}objectClass: olc${BACKEND}Config
    127 olcDatabase: {1}$BACKEND
    128 olcSuffix: $BASEDN
    129 ${nullExclude}olcDbDirectory: $DBDIR1
    130 olcRootDN: $MANAGERDN
    131 olcRootPW: $PASSWD
    132 EOF
    133 RC=$?
    134 if test $RC != 0 ; then
    135 	echo "ldapadd failed for database config ($RC)!"
    136 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    137 	exit $RC
    138 fi
    139 
    140 if test $INDEXDB = indexdb ; then
    141 	$LDAPMODIFY -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF >>$TESTOUT 2>&1
    142 dn: olcDatabase={1}$BACKEND,cn=config
    143 changetype: modify
    144 add: olcDbIndex
    145 olcDbIndex: objectClass,entryUUID,entryCSN eq
    146 olcDbIndex: cn,uid pres,eq,sub
    147 EOF
    148 	RC=$?
    149 	if test $RC != 0 ; then
    150 		echo "ldapadd modify for database config ($RC)!"
    151 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    152 		exit $RC
    153 	fi
    154 fi
    155 
    156 echo "Using ldapadd to populate slapd..."
    157 $LDAPADD -D "$MANAGERDN" -H $URIP1 -w $PASSWD -f $LDIFORDERED \
    158 	>> $TESTOUT 2>&1
    159 RC=$?
    160 if test $RC != 0 ; then
    161 	echo "ldapadd failed for database populate ($RC)!"
    162 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    163 	exit $RC
    164 fi
    165 
    166 echo "Adding server entries to slapd..."
    167 $LDAPADD -D "$MANAGERDN" -H $URIP1 -w $PASSWD <<EOF >> $TESTOUT 2>&1
    168 dn: ou=Servers,$BASEDN
    169 objectClass: organizationalUnit
    170 ou: Servers
    171 
    172 dn: cn=localhost,ou=Servers,$BASEDN
    173 objectClass: device
    174 objectClass: ipHost
    175 cn: localhost
    176 ipHostNumber: 127.0.0.1
    177 
    178 dn: cn=www.example.com,ou=Servers,$BASEDN
    179 objectClass: device
    180 objectClass: ipHost
    181 cn: localhost
    182 ipHostNumber: 93.184.216.34
    183 EOF
    184 RC=$?
    185 if test $RC != 0 ; then
    186 	echo "ldapadd failed for database populate ($RC)!"
    187 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    188 	exit $RC
    189 fi
    190 
    191 echo "Inserting autoca overlay on slapd..."
    192 if [ "$AUTOCA" = autocamod ]; then
    193 	$LDAPADD -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF > $TESTOUT 2>&1
    194 dn: cn=module,cn=config
    195 objectClass: olcModuleList
    196 cn: module
    197 olcModulePath: $TESTWD/../servers/slapd/overlays
    198 olcModuleLoad: autoca.la
    199 EOF
    200 	RC=$?
    201 	if test $RC != 0 ; then
    202 		echo "ldapadd failed for moduleLoad ($RC)!"
    203 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    204 		exit $RC
    205 	fi
    206 fi
    207 $LDAPMODIFY -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
    208 dn: olcOverlay=autoca,olcDatabase={1}$BACKEND,cn=config
    209 changetype: add
    210 objectClass: olcOverlayConfig
    211 objectClass: olcAutoCAConfig
    212 olcOverlay: autoca
    213 olcAutoCAlocalDN: cn=localhost,ou=Servers,$BASEDN
    214 EOF
    215 RC=$?
    216 if test $RC != 0 ; then
    217 	echo "ldapmodify failed for autoca config ($RC)!"
    218 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    219 	exit $RC
    220 fi
    221 echo "Using ldapsearch to retrieve CA cert..."
    222 $LDAPSEARCH -b $BASEDN -D $MANAGERDN -H $URIP1 -w $PASSWD -s base \
    223 	'objectclass=*' 'cACertificate;binary'  > $SEARCHOUT 2>&1
    224 RC=$?
    225 
    226 if test $RC != 0 ; then
    227 	echo "ldapsearch failed ($RC)!"
    228 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    229 	exit $RC
    230 fi
    231 
    232 echo "Setting up CA cert..."
    233 echo "-----BEGIN CERTIFICATE-----" > $TESTDIR/cacert.pem
    234 sed -e "/^dn:/d" -e "s/cACertificate;binary:://" -e "/^$/d" $SEARCHOUT >> $TESTDIR/cacert.pem
    235 echo "-----END CERTIFICATE-----" >> $TESTDIR/cacert.pem
    236 
    237 echo "Using ldapsearch to generate localhost cert..."
    238 $LDAPSEARCH -b cn=localhost,ou=Servers,$BASEDN -D $MANAGERDN -H $URIP1 -w $PASSWD -s base \
    239 	-A 'objectclass=*' 'userCertificate;binary' 'userPrivateKey;binary'  >> $TESTOUT 2>&1
    240 RC=$?
    241 
    242 if test $RC != 0 ; then
    243 	echo "ldapsearch failed ($RC)!"
    244 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    245 	exit $RC
    246 fi
    247 
    248 echo "Using ldapsearch to attempt TLS..."
    249 unset LDAPNOINIT
    250 LDAPTLS_CACERT=$TESTDIR/cacert.pem
    251 export LDAPTLS_CACERT
    252 $LDAPSEARCH -b $BASEDN -D $MANAGERDN -H $URIP1 -w $PASSWD -s base -ZZ \
    253 	'objectclass=*' >> $TESTOUT 2>&1
    254 RC=$?
    255 
    256 if test $RC != 0 ; then
    257 	echo "ldapsearch failed ($RC)!"
    258 	test $KILLSERVERS != no && kill -HUP $KILLPIDS
    259 	exit $RC
    260 fi
    261 
    262 if test $WITH_SASL = no ; then
    263 	echo "SASL support not available, skipping client cert authentication"
    264 else
    265 	# note - the attrs are being saved in raw DER form.
    266 	# they need to be base64 encoded into PEM for most programs to use them
    267 	# so we ignore those files for now.
    268 	echo "Using ldapsearch to generate user cert..."
    269 	$LDAPSEARCH -b "$BABSDN" -D $MANAGERDN -H $URIP1 -w $PASSWD -s base -ZZ \
    270 		-T $TESTDIR -t 'objectclass=*' 'userCertificate;binary' 'userPrivateKey;binary'  >> $TESTOUT 2>&1
    271 	RC=$?
    272 
    273 	if test $RC != 0 ; then
    274 		echo "ldapsearch failed ($RC)!"
    275 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    276 		exit $RC
    277 	fi
    278 
    279 	echo "Using ldapsearch to retrieve user cert..."
    280 	$LDAPSEARCH -b "$BABSDN" -D $MANAGERDN -H $URIP1 -w $PASSWD -s base -ZZ \
    281 		'objectclass=*' 'userCertificate;binary' > $SEARCHOUT 2>&1
    282 	RC=$?
    283 
    284 	if test $RC != 0 ; then
    285 		echo "ldapsearch failed ($RC)!"
    286 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    287 		exit $RC
    288 	fi
    289 
    290 	echo "Setting up user cert..."
    291 	echo "-----BEGIN CERTIFICATE-----" > $TESTDIR/usercert.pem
    292 	sed -e "/^dn:/d" -e "/^ dc=com/d" -e "s/userCertificate;binary:://" -e "/^$/d" $SEARCHOUT >> $TESTDIR/usercert.pem
    293 	echo "-----END CERTIFICATE-----" >> $TESTDIR/usercert.pem
    294 
    295 	echo "Using ldapsearch to retrieve user key..."
    296 	$LDAPSEARCH -b "$BABSDN" -D $MANAGERDN -H $URIP1 -w $PASSWD -s base -ZZ \
    297 		'objectclass=*' 'userPrivateKey;binary' > $SEARCHOUT 2>&1
    298 	RC=$?
    299 
    300 	if test $RC != 0 ; then
    301 		echo "ldapsearch failed ($RC)!"
    302 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    303 		exit $RC
    304 	fi
    305 
    306 	echo "Setting up user key..."
    307 	echo "-----BEGIN PRIVATE KEY-----" > $TESTDIR/userkey.pem
    308 	sed -e "/^dn:/d" -e "/^ dc=com/d" -e "s/userPrivateKey;binary:://" -e "/^$/d" $SEARCHOUT >> $TESTDIR/userkey.pem
    309 	echo "-----END PRIVATE KEY-----" >> $TESTDIR/userkey.pem
    310 
    311 	LDAPTLS_CERT=$TESTDIR/usercert.pem
    312 	LDAPTLS_KEY=$TESTDIR/userkey.pem
    313 	export LDAPTLS_CERT
    314 	export LDAPTLS_KEY
    315 
    316 	echo "Setting TLSVerifyClient to try..."
    317 	$LDAPMODIFY -D cn=config -H $URIP1 -y $CONFIGPWF <<EOF >> $TESTOUT 2>&1
    318 dn: cn=config
    319 changetype: modify
    320 replace: olcTLSVerifyClient
    321 olcTLSVerifyClient: try
    322 EOF
    323 	RC=$?
    324 	if test $RC != 0 ; then
    325 		echo "ldapmodify failed for autoca config ($RC)!"
    326 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    327 		exit $RC
    328 	fi
    329 
    330 	$CLIENTDIR/ldapwhoami -Y EXTERNAL -H $URIP1 -ZZ
    331 
    332 	if test $RC != 0 ; then
    333 		echo "ldapwhoami failed ($RC)!"
    334 		test $KILLSERVERS != no && kill -HUP $KILLPIDS
    335 		exit $RC
    336 	fi
    337 fi
    338 
    339 test $KILLSERVERS != no && kill -HUP $KILLPIDS
    340 
    341 echo ">>>>> Test succeeded"
    342 
    343 test $KILLSERVERS != no && wait
    344 
    345 exit 0
    346