Home | History | Annotate | Download | only in regress
      1 #	$OpenBSD: cert-userkey.sh,v 1.8 2011/05/17 07:13:31 djm Exp $
      2 #	Placed in the Public Domain.
      3 
      4 tid="certified user keys"
      5 
      6 # used to disable ECC based tests on platforms without ECC
      7 ecdsa=""
      8 if test "x$TEST_SSH_ECC" = "xyes"; then
      9 	ecdsa=ecdsa
     10 fi
     11 
     12 rm -f $OBJ/authorized_keys_$USER $OBJ/user_ca_key* $OBJ/cert_user_key*
     13 cp $OBJ/sshd_proxy $OBJ/sshd_proxy_bak
     14 
     15 # Create a CA key
     16 ${SSHKEYGEN} -q -N '' -t rsa  -f $OBJ/user_ca_key ||\
     17 	fail "ssh-keygen of user_ca_key failed"
     18 
     19 # Generate and sign user keys
     20 for ktype in rsa dsa $ecdsa ; do 
     21 	verbose "$tid: sign user ${ktype} cert"
     22 	${SSHKEYGEN} -q -N '' -t ${ktype} \
     23 	    -f $OBJ/cert_user_key_${ktype} || \
     24 		fail "ssh-keygen of cert_user_key_${ktype} failed"
     25 	${SSHKEYGEN} -q -s $OBJ/user_ca_key -I \
     26 	    "regress user key for $USER" \
     27 	    -n ${USER},mekmitasdigoat $OBJ/cert_user_key_${ktype} ||
     28 		fail "couldn't sign cert_user_key_${ktype}"
     29 	# v00 ecdsa certs do not exist
     30 	test "${ktype}" = "ecdsa" && continue
     31 	cp $OBJ/cert_user_key_${ktype} $OBJ/cert_user_key_${ktype}_v00
     32 	cp $OBJ/cert_user_key_${ktype}.pub $OBJ/cert_user_key_${ktype}_v00.pub
     33 	${SSHKEYGEN} -q -t v00 -s $OBJ/user_ca_key -I \
     34 	    "regress user key for $USER" \
     35 	    -n ${USER},mekmitasdigoat $OBJ/cert_user_key_${ktype}_v00 ||
     36 		fail "couldn't sign cert_user_key_${ktype}_v00"
     37 done
     38 
     39 # Test explicitly-specified principals
     40 for ktype in rsa dsa $ecdsa rsa_v00 dsa_v00 ; do 
     41 	for privsep in yes no ; do
     42 		_prefix="${ktype} privsep $privsep"
     43 
     44 		# Setup for AuthorizedPrincipalsFile
     45 		rm -f $OBJ/authorized_keys_$USER
     46 		(
     47 			cat $OBJ/sshd_proxy_bak
     48 			echo "UsePrivilegeSeparation $privsep"
     49 			echo "AuthorizedPrincipalsFile " \
     50 			    "$OBJ/authorized_principals_%u"
     51 			echo "TrustedUserCAKeys $OBJ/user_ca_key.pub"
     52 		) > $OBJ/sshd_proxy
     53 
     54 		# Missing authorized_principals
     55 		verbose "$tid: ${_prefix} missing authorized_principals"
     56 		rm -f $OBJ/authorized_principals_$USER
     57 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
     58 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
     59 		if [ $? -eq 0 ]; then
     60 			fail "ssh cert connect succeeded unexpectedly"
     61 		fi
     62 
     63 		# Empty authorized_principals
     64 		verbose "$tid: ${_prefix} empty authorized_principals"
     65 		echo > $OBJ/authorized_principals_$USER
     66 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
     67 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
     68 		if [ $? -eq 0 ]; then
     69 			fail "ssh cert connect succeeded unexpectedly"
     70 		fi
     71 	
     72 		# Wrong authorized_principals
     73 		verbose "$tid: ${_prefix} wrong authorized_principals"
     74 		echo gregorsamsa > $OBJ/authorized_principals_$USER
     75 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
     76 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
     77 		if [ $? -eq 0 ]; then
     78 			fail "ssh cert connect succeeded unexpectedly"
     79 		fi
     80 
     81 		# Correct authorized_principals
     82 		verbose "$tid: ${_prefix} correct authorized_principals"
     83 		echo mekmitasdigoat > $OBJ/authorized_principals_$USER
     84 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
     85 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
     86 		if [ $? -ne 0 ]; then
     87 			fail "ssh cert connect failed"
     88 		fi
     89 
     90 		# authorized_principals with bad key option
     91 		verbose "$tid: ${_prefix} authorized_principals bad key opt"
     92 		echo 'blah mekmitasdigoat' > $OBJ/authorized_principals_$USER
     93 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
     94 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
     95 		if [ $? -eq 0 ]; then
     96 			fail "ssh cert connect succeeded unexpectedly"
     97 		fi
     98 
     99 		# authorized_principals with command=false
    100 		verbose "$tid: ${_prefix} authorized_principals command=false"
    101 		echo 'command="false" mekmitasdigoat' > \
    102 		    $OBJ/authorized_principals_$USER
    103 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
    104 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    105 		if [ $? -eq 0 ]; then
    106 			fail "ssh cert connect succeeded unexpectedly"
    107 		fi
    108 
    109 
    110 		# authorized_principals with command=true
    111 		verbose "$tid: ${_prefix} authorized_principals command=true"
    112 		echo 'command="true" mekmitasdigoat' > \
    113 		    $OBJ/authorized_principals_$USER
    114 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
    115 		    -F $OBJ/ssh_proxy somehost false >/dev/null 2>&1
    116 		if [ $? -ne 0 ]; then
    117 			fail "ssh cert connect failed"
    118 		fi
    119 
    120 		# Setup for principals= key option
    121 		rm -f $OBJ/authorized_principals_$USER
    122 		(
    123 			cat $OBJ/sshd_proxy_bak
    124 			echo "UsePrivilegeSeparation $privsep"
    125 		) > $OBJ/sshd_proxy
    126 
    127 		# Wrong principals list
    128 		verbose "$tid: ${_prefix} wrong principals key option"
    129 		(
    130 			echon 'cert-authority,principals="gregorsamsa" '
    131 			cat $OBJ/user_ca_key.pub
    132 		) > $OBJ/authorized_keys_$USER
    133 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
    134 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    135 		if [ $? -eq 0 ]; then
    136 			fail "ssh cert connect succeeded unexpectedly"
    137 		fi
    138 
    139 		# Correct principals list
    140 		verbose "$tid: ${_prefix} correct principals key option"
    141 		(
    142 			echon 'cert-authority,principals="mekmitasdigoat" '
    143 			cat $OBJ/user_ca_key.pub
    144 		) > $OBJ/authorized_keys_$USER
    145 		${SSH} -2i $OBJ/cert_user_key_${ktype} \
    146 		    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    147 		if [ $? -ne 0 ]; then
    148 			fail "ssh cert connect failed"
    149 		fi
    150 	done
    151 done
    152 
    153 basic_tests() {
    154 	auth=$1
    155 	if test "x$auth" = "xauthorized_keys" ; then
    156 		# Add CA to authorized_keys
    157 		(
    158 			echon 'cert-authority '
    159 			cat $OBJ/user_ca_key.pub
    160 		) > $OBJ/authorized_keys_$USER
    161 	else
    162 		echo > $OBJ/authorized_keys_$USER
    163 		extra_sshd="TrustedUserCAKeys $OBJ/user_ca_key.pub"
    164 	fi
    165 	
    166 	for ktype in rsa dsa $ecdsa rsa_v00 dsa_v00 ; do 
    167 		for privsep in yes no ; do
    168 			_prefix="${ktype} privsep $privsep $auth"
    169 			# Simple connect
    170 			verbose "$tid: ${_prefix} connect"
    171 			(
    172 				cat $OBJ/sshd_proxy_bak
    173 				echo "UsePrivilegeSeparation $privsep"
    174 				echo "$extra_sshd"
    175 			) > $OBJ/sshd_proxy
    176 	
    177 			${SSH} -2i $OBJ/cert_user_key_${ktype} \
    178 			    -F $OBJ/ssh_proxy somehost true
    179 			if [ $? -ne 0 ]; then
    180 				fail "ssh cert connect failed"
    181 			fi
    182 
    183 			# Revoked keys
    184 			verbose "$tid: ${_prefix} revoked key"
    185 			(
    186 				cat $OBJ/sshd_proxy_bak
    187 				echo "UsePrivilegeSeparation $privsep"
    188 				echo "RevokedKeys $OBJ/cert_user_key_${ktype}.pub"
    189 				echo "$extra_sshd"
    190 			) > $OBJ/sshd_proxy
    191 			${SSH} -2i $OBJ/cert_user_key_${ktype} \
    192 			    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    193 			if [ $? -eq 0 ]; then
    194 				fail "ssh cert connect succeeded unexpecedly"
    195 			fi
    196 		done
    197 	
    198 		# Revoked CA
    199 		verbose "$tid: ${ktype} $auth revoked CA key"
    200 		(
    201 			cat $OBJ/sshd_proxy_bak
    202 			echo "RevokedKeys $OBJ/user_ca_key.pub"
    203 			echo "$extra_sshd"
    204 		) > $OBJ/sshd_proxy
    205 		${SSH} -2i $OBJ/cert_user_key_${ktype} -F $OBJ/ssh_proxy \
    206 		    somehost true >/dev/null 2>&1
    207 		if [ $? -eq 0 ]; then
    208 			fail "ssh cert connect succeeded unexpecedly"
    209 		fi
    210 	done
    211 	
    212 	verbose "$tid: $auth CA does not authenticate"
    213 	(
    214 		cat $OBJ/sshd_proxy_bak
    215 		echo "$extra_sshd"
    216 	) > $OBJ/sshd_proxy
    217 	verbose "$tid: ensure CA key does not authenticate user"
    218 	${SSH} -2i $OBJ/user_ca_key \
    219 	    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    220 	if [ $? -eq 0 ]; then
    221 		fail "ssh cert connect with CA key succeeded unexpectedly"
    222 	fi
    223 }
    224 
    225 basic_tests authorized_keys
    226 basic_tests TrustedUserCAKeys
    227 
    228 test_one() {
    229 	ident=$1
    230 	result=$2
    231 	sign_opts=$3
    232 	auth_choice=$4
    233 	auth_opt=$5
    234 
    235 	if test "x$auth_choice" = "x" ; then
    236 		auth_choice="authorized_keys TrustedUserCAKeys"
    237 	fi
    238 
    239 	for auth in $auth_choice ; do
    240 		for ktype in rsa rsa_v00 ; do
    241 			case $ktype in
    242 			*_v00) keyv="-t v00" ;;
    243 			*) keyv="" ;;
    244 			esac
    245 
    246 			cat $OBJ/sshd_proxy_bak > $OBJ/sshd_proxy
    247 			if test "x$auth" = "xauthorized_keys" ; then
    248 				# Add CA to authorized_keys
    249 				(
    250 					echon "cert-authority${auth_opt} "
    251 					cat $OBJ/user_ca_key.pub
    252 				) > $OBJ/authorized_keys_$USER
    253 			else
    254 				echo > $OBJ/authorized_keys_$USER
    255 				echo "TrustedUserCAKeys $OBJ/user_ca_key.pub" \
    256 				    >> $OBJ/sshd_proxy
    257 				if test "x$auth_opt" != "x" ; then
    258 					echo $auth_opt >> $OBJ/sshd_proxy
    259 				fi
    260 			fi
    261 			
    262 			verbose "$tid: $ident auth $auth expect $result $ktype"
    263 			${SSHKEYGEN} -q -s $OBJ/user_ca_key \
    264 			    -I "regress user key for $USER" \
    265 			    $sign_opts $keyv \
    266 			    $OBJ/cert_user_key_${ktype} ||
    267 				fail "couldn't sign cert_user_key_${ktype}"
    268 
    269 			${SSH} -2i $OBJ/cert_user_key_${ktype} \
    270 			    -F $OBJ/ssh_proxy somehost true >/dev/null 2>&1
    271 			rc=$?
    272 			if [ "x$result" = "xsuccess" ] ; then
    273 				if [ $rc -ne 0 ]; then
    274 					fail "$ident failed unexpectedly"
    275 				fi
    276 			else
    277 				if [ $rc -eq 0 ]; then
    278 					fail "$ident succeeded unexpectedly"
    279 				fi
    280 			fi
    281 		done
    282 	done
    283 }
    284 
    285 test_one "correct principal"	success "-n ${USER}"
    286 test_one "host-certificate"	failure "-n ${USER} -h"
    287 test_one "wrong principals"	failure "-n foo"
    288 test_one "cert not yet valid"	failure "-n ${USER} -V20200101:20300101"
    289 test_one "cert expired"		failure "-n ${USER} -V19800101:19900101"
    290 test_one "cert valid interval"	success "-n ${USER} -V-1w:+2w"
    291 test_one "wrong source-address"	failure "-n ${USER} -Osource-address=10.0.0.0/8"
    292 test_one "force-command"	failure "-n ${USER} -Oforce-command=false"
    293 
    294 # Behaviour is different here: TrustedUserCAKeys doesn't allow empty principals
    295 test_one "empty principals"	success "" authorized_keys
    296 test_one "empty principals"	failure "" TrustedUserCAKeys
    297 
    298 # Check explicitly-specified principals: an empty principals list in the cert
    299 # should always be refused.
    300 
    301 # AuthorizedPrincipalsFile
    302 rm -f $OBJ/authorized_keys_$USER
    303 echo mekmitasdigoat > $OBJ/authorized_principals_$USER
    304 test_one "AuthorizedPrincipalsFile principals" success "-n mekmitasdigoat" \
    305     TrustedUserCAKeys "AuthorizedPrincipalsFile $OBJ/authorized_principals_%u"
    306 test_one "AuthorizedPrincipalsFile no principals" failure "" \
    307     TrustedUserCAKeys "AuthorizedPrincipalsFile $OBJ/authorized_principals_%u"
    308 
    309 # principals= key option
    310 rm -f $OBJ/authorized_principals_$USER
    311 test_one "principals key option principals" success "-n mekmitasdigoat" \
    312     authorized_keys ',principals="mekmitasdigoat"'
    313 test_one "principals key option no principals" failure "" \
    314     authorized_keys ',principals="mekmitasdigoat"'
    315 
    316 # Wrong certificate
    317 cat $OBJ/sshd_proxy_bak > $OBJ/sshd_proxy
    318 for ktype in rsa dsa $ecdsa rsa_v00 dsa_v00 ; do 
    319 	case $ktype in
    320 	*_v00) args="-t v00" ;;
    321 	*) args="" ;;
    322 	esac
    323 	# Self-sign
    324 	${SSHKEYGEN} $args -q -s $OBJ/cert_user_key_${ktype} -I \
    325 	    "regress user key for $USER" \
    326 	    -n $USER $OBJ/cert_user_key_${ktype} ||
    327 		fail "couldn't sign cert_user_key_${ktype}"
    328 	verbose "$tid: user ${ktype} connect wrong cert"
    329 	${SSH} -2i $OBJ/cert_user_key_${ktype} -F $OBJ/ssh_proxy \
    330 	    somehost true >/dev/null 2>&1
    331 	if [ $? -eq 0 ]; then
    332 		fail "ssh cert connect $ident succeeded unexpectedly"
    333 	fi
    334 done
    335 
    336 rm -f $OBJ/authorized_keys_$USER $OBJ/user_ca_key* $OBJ/cert_user_key*
    337 rm -f $OBJ/authorized_principals_$USER
    338 
    339