/mandos/trunk

To get this branch, use:
bzr branch http://bzr.recompile.se/loggerhead/mandos/trunk

« back to all changes in this revision

Viewing changes to mandos-keygen

  • Committer: Teddy Hogeborn
  • Date: 2021-02-03 23:10:42 UTC
  • Revision ID: teddy@recompile.se-20210203231042-2z3egrvpo1zt7nej
mandos-ctl: Fix bad test for command.Remove and related minor issues

The test for command.Remove removes all clients from the spy server,
and then loops over all clients, looking for the corresponding Remove
command as recorded by the spy server.  But since since there aren't
any clients left after they were removed, no assertions are made, and
the test therefore does nothing.  Fix this.

In tests for command.Approve and command.Deny, add checks that clients
were not somehow removed by the command (in which case, likewise, no
assertions are made).

Add related checks to TestPropertySetterCmd.runTest; i.e. test that a
sequence is not empty before looping over it and making assertions.

* mandos-ctl (TestBaseCommands.test_Remove): Save a copy of the
  original "clients" dict, and loop over those instead.  Add assertion
  that all clients were indeed removed.  Also fix the code which looks
  for the Remove command, which now needs to actually work.
  (TestBaseCommands.test_Approve, TestBaseCommands.test_Deny): Add
  assertion that there are still clients before looping over them.
  (TestPropertySetterCmd.runTest): Add assertion that the list of
  values to get is not empty before looping over them.  Also add check
  that there are still clients before looping over clients.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#!/bin/sh -e
2
2
3
 
# Mandos key generator - create a new OpenPGP key for a Mandos client
 
3
# Mandos key generator - create new keys for a Mandos client
4
4
5
 
# Copyright © 2008-2017 Teddy Hogeborn
6
 
# Copyright © 2008-2017 Björn Påhlsson
 
5
# Copyright © 2008-2019 Teddy Hogeborn
 
6
# Copyright © 2008-2019 Björn Påhlsson
7
7
8
8
# This file is part of Mandos.
9
9
#
23
23
# Contact the authors at <mandos@recompile.se>.
24
24
25
25
 
26
 
VERSION="1.7.15"
 
26
VERSION="1.8.14"
27
27
 
28
28
KEYDIR="/etc/keys/mandos"
29
29
KEYTYPE=RSA
34
34
KEYEMAIL=""
35
35
KEYCOMMENT=""
36
36
KEYEXPIRE=0
 
37
TLS_KEYTYPE=ed25519
37
38
FORCE=no
38
39
SSH=yes
39
40
KEYCOMMENT_ORIG="$KEYCOMMENT"
44
45
fi
45
46
 
46
47
# Parse options
47
 
TEMP=`getopt --options vhpF:d:t:l:s:L:n:e:c:x:fS \
48
 
    --longoptions version,help,password,passfile:,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force,no-ssh \
 
48
TEMP=`getopt --options vhpF:d:t:l:s:L:n:e:c:x:T:fS \
 
49
    --longoptions version,help,password,passfile:,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,tls-keytype:,force,no-ssh \
49
50
    --name "$0" -- "$@"`
50
51
 
51
52
help(){
63
64
  -v, --version         Show program's version number and exit
64
65
  -h, --help            Show this help message and exit
65
66
  -d DIR, --dir DIR     Target directory for key files
66
 
  -t TYPE, --type TYPE  Key type.  Default is RSA.
 
67
  -t TYPE, --type TYPE  OpenPGP key type.  Default is RSA.
67
68
  -l BITS, --length BITS
68
 
                        Key length in bits.  Default is 4096.
 
69
                        OpenPGP key length in bits.  Default is 4096.
69
70
  -s TYPE, --subtype TYPE
70
 
                        Subkey type.  Default is RSA.
 
71
                        OpenPGP subkey type.  Default is RSA.
71
72
  -L BITS, --sublength BITS
72
 
                        Subkey length in bits.  Default is 4096.
 
73
                        OpenPGP subkey length in bits.  Default 4096.
73
74
  -n NAME, --name NAME  Name of key.  Default is the FQDN.
74
75
  -e ADDRESS, --email ADDRESS
75
 
                        Email address of key.  Default is empty.
 
76
                        Email address of OpenPGP key.  Default empty.
76
77
  -c TEXT, --comment TEXT
77
 
                        Comment field for key.  The default is empty.
 
78
                        Comment field for OpenPGP key.  Default empty.
78
79
  -x TIME, --expire TIME
79
 
                        Key expire time.  Default is no expiration.
 
80
                        OpenPGP key expire time.  Default is none.
80
81
                        See gpg(1) for syntax.
 
82
  -T TYPE, --tls-keytype TYPE
 
83
                        TLS key type.  Default is ed25519.
81
84
  -f, --force           Force overwriting old key files.
82
85
 
83
86
Password creation options:
106
109
        -e|--email) KEYEMAIL="$2"; shift 2;;
107
110
        -c|--comment) KEYCOMMENT="$2"; shift 2;;
108
111
        -x|--expire) KEYEXPIRE="$2"; shift 2;;
 
112
        -T|--tls-keytype) TLS_KEYTYPE="$2"; shift 2;;
109
113
        -f|--force) FORCE=yes; shift;;
110
114
        -S|--no-ssh) SSH=no; shift;;
111
115
        -v|--version) echo "$0 $VERSION"; exit;;
121
125
 
122
126
SECKEYFILE="$KEYDIR/seckey.txt"
123
127
PUBKEYFILE="$KEYDIR/pubkey.txt"
 
128
TLS_PRIVKEYFILE="$KEYDIR/tls-privkey.pem"
 
129
TLS_PUBKEYFILE="$KEYDIR/tls-pubkey.pem"
124
130
 
125
131
# Check for some invalid values
126
132
if [ ! -d "$KEYDIR" ]; then
163
169
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
164
170
    esac
165
171
    
166
 
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ]; } \
 
172
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ] \
 
173
             || [ -e "$TLS_PRIVKEYFILE" ] \
 
174
             || [ -e "$TLS_PUBKEYFILE" ]; } \
167
175
        && [ "$FORCE" -eq 0 ]; then
168
176
        echo "Refusing to overwrite old key files; use --force" >&2
169
177
        exit 1
179
187
    
180
188
    # Create temporary gpg batch file
181
189
    BATCHFILE="`mktemp -t mandos-keygen-batch.XXXXXXXXXX`"
 
190
    TLS_PRIVKEYTMP="`mktemp -t mandos-keygen-privkey.XXXXXXXXXX`"
182
191
fi
183
192
 
184
193
if [ "$mode" = password ]; then
193
202
trap "
194
203
set +e; \
195
204
test -n \"$SECFILE\" && shred --remove \"$SECFILE\"; \
 
205
test -n \"$TLS_PRIVKEYTMP\" && shred --remove \"$TLS_PRIVKEYTMP\"; \
196
206
shred --remove \"$RINGDIR\"/sec* 2>/dev/null;
197
207
test -n \"$BATCHFILE\" && rm --force \"$BATCHFILE\"; \
198
208
rm --recursive --force \"$RINGDIR\";
233
243
        echo -n "Started: "
234
244
        date
235
245
    fi
 
246
 
 
247
    # Generate TLS private key
 
248
    if certtool --generate-privkey --password='' \
 
249
                --outfile "$TLS_PRIVKEYTMP" --sec-param ultra \
 
250
                --key-type="$TLS_KEYTYPE" --pkcs8 --no-text 2>/dev/null; then
 
251
        
 
252
        # Backup any old key files
 
253
        if cp --backup=numbered --force "$TLS_PRIVKEYFILE" "$TLS_PRIVKEYFILE" \
 
254
              2>/dev/null; then
 
255
            shred --remove "$TLS_PRIVKEYFILE" 2>/dev/null || :
 
256
        fi
 
257
        if cp --backup=numbered --force "$TLS_PUBKEYFILE" "$TLS_PUBKEYFILE" \
 
258
              2>/dev/null; then
 
259
            rm --force "$TLS_PUBKEYFILE"
 
260
        fi
 
261
        cp --archive "$TLS_PRIVKEYTMP" "$TLS_PRIVKEYFILE"
 
262
        shred --remove "$TLS_PRIVKEYTMP" 2>/dev/null || :
 
263
 
 
264
        ## TLS public key
 
265
 
 
266
        # First try certtool from GnuTLS
 
267
        if ! certtool --password='' --load-privkey="$TLS_PRIVKEYFILE" \
 
268
             --outfile="$TLS_PUBKEYFILE" --pubkey-info --no-text \
 
269
             2>/dev/null; then
 
270
            # Otherwise try OpenSSL
 
271
            if ! openssl pkey -in "$TLS_PRIVKEYFILE" \
 
272
                 -out "$TLS_PUBKEYFILE" -pubout; then
 
273
                rm --force "$TLS_PUBKEYFILE"
 
274
                # None of the commands succeded; give up
 
275
                return 1
 
276
            fi
 
277
        fi
 
278
    fi
236
279
    
237
280
    # Make sure trustdb.gpg exists;
238
281
    # this is a workaround for Debian bug #737128
253
296
    # Backup any old key files
254
297
    if cp --backup=numbered --force "$SECKEYFILE" "$SECKEYFILE" \
255
298
        2>/dev/null; then
256
 
        shred --remove "$SECKEYFILE"
 
299
        shred --remove "$SECKEYFILE" 2>/dev/null || :
257
300
    fi
258
301
    if cp --backup=numbered --force "$PUBKEYFILE" "$PUBKEYFILE" \
259
302
        2>/dev/null; then
321
364
    
322
365
    test -n "$FINGERPRINT"
323
366
    
 
367
    if [ -r "$TLS_PUBKEYFILE" ]; then
 
368
       KEY_ID="$(certtool --key-id --hash=sha256 \
 
369
                       --infile="$TLS_PUBKEYFILE" 2>/dev/null || :)"
 
370
 
 
371
       if [ -z "$KEY_ID" ]; then
 
372
           KEY_ID=$(openssl pkey -pubin -in "$TLS_PUBKEYFILE" \
 
373
                            -outform der \
 
374
                        | openssl sha256 \
 
375
                        | sed --expression='s/^.*[^[:xdigit:]]//')
 
376
       fi
 
377
       test -n "$KEY_ID"
 
378
    fi
 
379
    
324
380
    FILECOMMENT="Encrypted password for a Mandos client"
325
381
    
326
382
    while [ ! -s "$SECFILE" ]; do
327
383
        if [ -n "$PASSFILE" ]; then
328
 
            cat "$PASSFILE"
 
384
            cat -- "$PASSFILE"
329
385
        else
330
386
            tty --quiet && stty -echo
331
387
            echo -n "Enter passphrase: " >/dev/tty
360
416
    cat <<-EOF
361
417
        [$KEYNAME]
362
418
        host = $KEYNAME
 
419
        EOF
 
420
    if [ -n "$KEY_ID" ]; then
 
421
        echo "key_id = $KEY_ID"
 
422
    fi
 
423
    cat <<-EOF
363
424
        fingerprint = $FINGERPRINT
364
425
        secret =
365
426
        EOF
383
444
set +e
384
445
# Remove the password file, if any
385
446
if [ -n "$SECFILE" ]; then
386
 
    shred --remove "$SECFILE"
 
447
    shred --remove "$SECFILE" 2>/dev/null
387
448
fi
388
449
# Remove the key rings
389
450
shred --remove "$RINGDIR"/sec* 2>/dev/null