/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: 2018-08-15 09:26:02 UTC
  • Revision ID: teddy@recompile.se-20180815092602-xoyb5s6gf8376i7u
mandos-client: Set system clock if necessary

* plugins.d/mandos-client.c (init_gpgme/import_key): If the system
  clock is not set, or set to january 1970, set the system clock to
  the more plausible value that is the mtime of the key file.  This is
  required by GnuPG to be able to import the keys.  (We can't pass the
  --ignore-time-conflict or the --ignore-valid-from options though
  GPGME.)

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
3
3
# Mandos key generator - create a new OpenPGP key for a Mandos client
4
4
5
 
# Copyright © 2008-2013 Teddy Hogeborn
6
 
# Copyright © 2008-2013 Björn Påhlsson
 
5
# Copyright © 2008-2018 Teddy Hogeborn
 
6
# Copyright © 2008-2018 Björn Påhlsson
7
7
8
 
# This program is free software: you can redistribute it and/or modify
9
 
# it under the terms of the GNU General Public License as published by
 
8
# This file is part of Mandos.
 
9
#
 
10
# Mandos is free software: you can redistribute it and/or modify it
 
11
# under the terms of the GNU General Public License as published by
10
12
# the Free Software Foundation, either version 3 of the License, or
11
13
# (at your option) any later version.
12
14
#
13
 
#     This program is distributed in the hope that it will be useful,
14
 
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
 
15
#     Mandos is distributed in the hope that it will be useful, but
 
16
#     WITHOUT ANY WARRANTY; without even the implied warranty of
15
17
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
18
#     GNU General Public License for more details.
17
19
18
20
# You should have received a copy of the GNU General Public License
19
 
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
21
# along with Mandos.  If not, see <http://www.gnu.org/licenses/>.
20
22
21
23
# Contact the authors at <mandos@recompile.se>.
22
24
23
25
 
24
 
VERSION="1.6.2"
 
26
VERSION="1.7.19"
25
27
 
26
28
KEYDIR="/etc/keys/mandos"
27
29
KEYTYPE=RSA
33
35
KEYCOMMENT=""
34
36
KEYEXPIRE=0
35
37
FORCE=no
 
38
SSH=yes
36
39
KEYCOMMENT_ORIG="$KEYCOMMENT"
37
40
mode=keygen
38
41
 
41
44
fi
42
45
 
43
46
# Parse options
44
 
TEMP=`getopt --options vhpF:d:t:l:s:L:n:e:c:x:f \
45
 
    --longoptions version,help,password,passfile:,dir:,type:,length:,subtype:,sublength:,name:,email:,comment:,expire:,force \
 
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 \
46
49
    --name "$0" -- "$@"`
47
50
 
48
51
help(){
49
 
basename="`basename $0`"
 
52
basename="`basename "$0"`"
50
53
cat <<EOF
51
54
Usage: $basename [ -v | --version ]
52
55
       $basename [ -h | --help ]
85
88
                        Encrypt a password from FILE using the key in
86
89
                        the key directory.  All options other than
87
90
                        --dir and --name are ignored.
 
91
  -S, --no-ssh          Don't get SSH key or set "checker" option.
88
92
EOF
89
93
}
90
94
 
103
107
        -c|--comment) KEYCOMMENT="$2"; shift 2;;
104
108
        -x|--expire) KEYEXPIRE="$2"; shift 2;;
105
109
        -f|--force) FORCE=yes; shift;;
 
110
        -S|--no-ssh) SSH=no; shift;;
106
111
        -v|--version) echo "$0 $VERSION"; exit;;
107
112
        -h|--help) help; exit;;
108
113
        --) shift; break;;
110
115
    esac
111
116
done
112
117
if [ "$#" -gt 0 ]; then
113
 
    echo "Unknown arguments: '$@'" >&2
 
118
    echo "Unknown arguments: '$*'" >&2
114
119
    exit 1
115
120
fi
116
121
 
158
163
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) FORCE=0;;
159
164
    esac
160
165
    
161
 
    if [ \( -e "$SECKEYFILE" -o -e "$PUBKEYFILE" \) \
162
 
        -a "$FORCE" -eq 0 ]; then
 
166
    if { [ -e "$SECKEYFILE" ] || [ -e "$PUBKEYFILE" ]; } \
 
167
        && [ "$FORCE" -eq 0 ]; then
163
168
        echo "Refusing to overwrite old key files; use --force" >&2
164
169
        exit 1
165
170
    fi
188
193
trap "
189
194
set +e; \
190
195
test -n \"$SECFILE\" && shred --remove \"$SECFILE\"; \
191
 
shred --remove \"$RINGDIR\"/sec*;
 
196
shred --remove \"$RINGDIR\"/sec* 2>/dev/null;
192
197
test -n \"$BATCHFILE\" && rm --force \"$BATCHFILE\"; \
193
198
rm --recursive --force \"$RINGDIR\";
194
199
tty --quiet && stty echo; \
215
220
        #Handle: <no-spaces>
216
221
        #%pubring pubring.gpg
217
222
        #%secring secring.gpg
 
223
        %no-protection
218
224
        %commit
219
225
        EOF
220
226
    
228
234
        date
229
235
    fi
230
236
    
 
237
    # Make sure trustdb.gpg exists;
 
238
    # this is a workaround for Debian bug #737128
 
239
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
 
240
        --homedir "$RINGDIR" \
 
241
        --import-ownertrust < /dev/null
231
242
    # Generate a new key in the key rings
232
243
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
233
244
        --homedir "$RINGDIR" --trust-model always \
269
280
fi
270
281
 
271
282
if [ "$mode" = password ]; then
 
283
    
 
284
    # Make SSH be 0 or 1
 
285
    case "$SSH" in
 
286
        [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]) SSH=1;;
 
287
        [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|*) SSH=0;;
 
288
    esac
 
289
    
 
290
    if [ $SSH -eq 1 ]; then
 
291
        for ssh_keytype in ecdsa-sha2-nistp256 ed25519 rsa; do
 
292
            set +e
 
293
            ssh_fingerprint="`ssh-keyscan -t $ssh_keytype localhost 2>/dev/null`"
 
294
            err=$?
 
295
            set -e
 
296
            if [ $err -ne 0 ]; then
 
297
                ssh_fingerprint=""
 
298
                continue
 
299
            fi
 
300
            if [ -n "$ssh_fingerprint" ]; then
 
301
                ssh_fingerprint="${ssh_fingerprint#localhost }"
 
302
                break
 
303
            fi
 
304
        done
 
305
    fi
 
306
    
272
307
    # Import key into temporary key rings
273
308
    gpg --quiet --batch --no-tty --no-options --enable-dsa2 \
274
309
        --homedir "$RINGDIR" --trust-model always --armor \
279
314
    
280
315
    # Get fingerprint of key
281
316
    FINGERPRINT="`gpg --quiet --batch --no-tty --no-options \
282
 
        --enable-dsa2 --homedir \"$RINGDIR\" --trust-model always \
 
317
        --enable-dsa2 --homedir "$RINGDIR" --trust-model always \
283
318
        --fingerprint --with-colons \
284
319
        | sed --quiet \
285
320
        --expression='/^fpr:/{s/^fpr:.*:\\([0-9A-Z]*\\):\$/\\1/p;q}'`"
293
328
            cat "$PASSFILE"
294
329
        else
295
330
            tty --quiet && stty -echo
296
 
            echo -n "Enter passphrase: " >&2
297
 
            read first
 
331
            echo -n "Enter passphrase: " >/dev/tty
 
332
            read -r first
298
333
            tty --quiet && echo >&2
299
 
            echo -n "Repeat passphrase: " >&2
300
 
            read second
 
334
            echo -n "Repeat passphrase: " >/dev/tty
 
335
            read -r second
301
336
            if tty --quiet; then
302
337
                echo >&2
303
338
                stty echo
337
372
                /^[^-]/s/^/    /p
338
373
            }
339
374
        }' < "$SECFILE"
 
375
    if [ -n "$ssh_fingerprint" ]; then
 
376
        echo 'checker = ssh-keyscan -t '"$ssh_keytype"' %%(host)s 2>/dev/null | grep --fixed-strings --line-regexp --quiet --regexp=%%(host)s" %(ssh_fingerprint)s"'
 
377
        echo "ssh_fingerprint = ${ssh_fingerprint}"
 
378
    fi
340
379
fi
341
380
 
342
381
trap - EXIT
347
386
    shred --remove "$SECFILE"
348
387
fi
349
388
# Remove the key rings
350
 
shred --remove "$RINGDIR"/sec*
 
389
shred --remove "$RINGDIR"/sec* 2>/dev/null
351
390
rm --recursive --force "$RINGDIR"