MODSIGN: Automatically generate module signing keys if missing
David Howells [Wed, 26 Sep 2012 09:09:51 +0000 (10:09 +0100)]
Automatically generate keys for module signing if they're absent so that
allyesconfig doesn't break.  The builder should consider generating their own
key and certificate, however, so that the keys are appropriately named.

The private key for the module signer should be placed in signing_key.priv
(unencrypted!) and the public key in an X.509 certificate as signing_key.x509.

If a transient key is desired for signing the modules, a config file for
'openssl req' can be placed in x509.genkey, looking something like the
following:

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
x509_extensions = myexts

[ req_distinguished_name ]
O = Magarathea
CN = Glacier signing key
emailAddress = slartibartfast@magrathea.h2g2

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=hash

The build process will use this to configure:

openssl req -new -nodes -utf8 -sha1 -days 36500 -batch \
-x509 -config x509.genkey \
-outform DER -out signing_key.x509 \
-keyout signing_key.priv

to generate the key.

Note that it is required that the X.509 certificate have a subjectKeyIdentifier
and an authorityKeyIdentifier.  Without those, the certificate will be
rejected.  These can be used to check the validity of a certificate.

Note that 'make distclean' will remove signing_key.{priv,x509} and x509.genkey,
whether or not they were generated automatically.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>

kernel/Makefile

index 08ba8a6..58c6f11 100644 (file)
@@ -132,3 +132,52 @@ quiet_cmd_timeconst  = TIMEC   $@
 targets += timeconst.h
 $(obj)/timeconst.h: $(src)/timeconst.pl FORCE
        $(call if_changed,timeconst)
+
+ifeq ($(CONFIG_MODULE_SIG),y)
+
+###############################################################################
+#
+# If module signing is requested, say by allyesconfig, but a key has not been
+# supplied, then one will need to be generated to make sure the build does not
+# fail and that the kernel may be used afterwards.
+#
+###############################################################################
+signing_key.priv signing_key.x509: x509.genkey
+       @echo "###"
+       @echo "### Now generating an X.509 key pair to be used for signing modules."
+       @echo "###"
+       @echo "### If this takes a long time, you might wish to run rngd in the"
+       @echo "### background to keep the supply of entropy topped up.  It"
+       @echo "### needs to be run as root, and should use a hardware random"
+       @echo "### number generator if one is available, eg:"
+       @echo "###"
+       @echo "###     rngd -r /dev/hwrandom"
+       @echo "###"
+       openssl req -new -nodes -utf8 -sha1 -days 36500 -batch \
+               -x509 -config x509.genkey \
+               -outform DER -out signing_key.x509 \
+               -keyout signing_key.priv
+       @echo "###"
+       @echo "### Key pair generated."
+       @echo "###"
+
+x509.genkey:
+       @echo Generating X.509 key generation config
+       @echo  >x509.genkey "[ req ]"
+       @echo >>x509.genkey "default_bits = 4096"
+       @echo >>x509.genkey "distinguished_name = req_distinguished_name"
+       @echo >>x509.genkey "prompt = no"
+       @echo >>x509.genkey "x509_extensions = myexts"
+       @echo >>x509.genkey
+       @echo >>x509.genkey "[ req_distinguished_name ]"
+       @echo >>x509.genkey "O = Magrathea"
+       @echo >>x509.genkey "CN = Glacier signing key"
+       @echo >>x509.genkey "emailAddress = slartibartfast@magrathea.h2g2"
+       @echo >>x509.genkey
+       @echo >>x509.genkey "[ myexts ]"
+       @echo >>x509.genkey "basicConstraints=critical,CA:FALSE"
+       @echo >>x509.genkey "keyUsage=digitalSignature"
+       @echo >>x509.genkey "subjectKeyIdentifier=hash"
+       @echo >>x509.genkey "authorityKeyIdentifier=keyid"
+endif
+CLEAN_FILES += signing_key.priv signing_key.x509 x509.genkey