acme service: generate a CA for self-signed certificate
This is needed because simp_le expects two certificates in fullchain.pem, leading to error: > Not enough PEM encoded messages were found in fullchain.pem; at least 2 were expected, found 1. We now create a CA and sign the key with it instead, providing correct fullchain.pem. Also cleanup service a bit -- use PATH and a private temporary directory (which is more suitable).
This commit is contained in:
parent
d91caac6c3
commit
4fc0b4edca
@ -240,6 +240,7 @@ in
|
|||||||
};
|
};
|
||||||
selfsignedService = {
|
selfsignedService = {
|
||||||
description = "Create preliminary self-signed certificate for ${cert}";
|
description = "Create preliminary self-signed certificate for ${cert}";
|
||||||
|
path = [ pkgs.openssl ];
|
||||||
preStart = ''
|
preStart = ''
|
||||||
if [ ! -d '${cpath}' ]
|
if [ ! -d '${cpath}' ]
|
||||||
then
|
then
|
||||||
@ -250,37 +251,41 @@ in
|
|||||||
'';
|
'';
|
||||||
script =
|
script =
|
||||||
''
|
''
|
||||||
# Create self-signed key
|
workdir="$(mktemp -d)"
|
||||||
workdir="/run/acme-selfsigned-${cert}"
|
|
||||||
${pkgs.openssl.bin}/bin/openssl genrsa -des3 -passout pass:x -out $workdir/server.pass.key 2048
|
# Create CA
|
||||||
${pkgs.openssl.bin}/bin/openssl rsa -passin pass:x -in $workdir/server.pass.key -out $workdir/server.key
|
openssl genrsa -des3 -passout pass:x -out $workdir/ca.pass.key 2048
|
||||||
${pkgs.openssl.bin}/bin/openssl req -new -key $workdir/server.key -out $workdir/server.csr \
|
openssl rsa -passin pass:x -in $workdir/ca.pass.key -out $workdir/ca.key
|
||||||
|
openssl req -new -key $workdir/ca.key -out $workdir/ca.csr \
|
||||||
|
-subj "/C=UK/ST=Warwickshire/L=Leamington/O=OrgName/OU=Security Department/CN=example.com"
|
||||||
|
openssl x509 -req -days 1 -in $workdir/ca.csr -signkey $workdir/ca.key -out $workdir/ca.crt
|
||||||
|
|
||||||
|
# Create key
|
||||||
|
openssl genrsa -des3 -passout pass:x -out $workdir/server.pass.key 2048
|
||||||
|
openssl rsa -passin pass:x -in $workdir/server.pass.key -out $workdir/server.key
|
||||||
|
openssl req -new -key $workdir/server.key -out $workdir/server.csr \
|
||||||
-subj "/C=UK/ST=Warwickshire/L=Leamington/O=OrgName/OU=IT Department/CN=example.com"
|
-subj "/C=UK/ST=Warwickshire/L=Leamington/O=OrgName/OU=IT Department/CN=example.com"
|
||||||
${pkgs.openssl.bin}/bin/openssl x509 -req -days 1 -in $workdir/server.csr -signkey $workdir/server.key -out $workdir/server.crt
|
openssl x509 -req -days 1 -in $workdir/server.csr -CA $workdir/ca.crt \
|
||||||
|
-CAkey $workdir/ca.key -CAserial $workdir/ca.srl -CAcreateserial \
|
||||||
|
-out $workdir/server.crt
|
||||||
|
|
||||||
# Move key to destination
|
# Copy key to destination
|
||||||
mv $workdir/server.key ${cpath}/key.pem
|
cp $workdir/server.key ${cpath}/key.pem
|
||||||
mv $workdir/server.crt ${cpath}/fullchain.pem
|
|
||||||
|
|
||||||
# Create full.pem for e.g. lighttpd (same format as "simp_le ... -f full.pem" creates)
|
# Create fullchain.pem (same format as "simp_le ... -f fullchain.pem" creates)
|
||||||
cat "${cpath}/key.pem" "${cpath}/fullchain.pem" > "${cpath}/full.pem"
|
cat $workdir/{server.crt,ca.crt} > "${cpath}/fullchain.pem"
|
||||||
|
|
||||||
# Clean up working directory
|
# Create full.pem for e.g. lighttpd
|
||||||
rm $workdir/server.csr
|
cat $workdir/{server.key,server.crt,ca.crt} > "${cpath}/full.pem"
|
||||||
rm $workdir/server.pass.key
|
|
||||||
|
|
||||||
# Give key acme permissions
|
# Give key acme permissions
|
||||||
chmod ${rights} '${cpath}/key.pem'
|
chown '${data.user}:${data.group}' "${cpath}/"{key,fullchain,full}.pem
|
||||||
chown '${data.user}:${data.group}' '${cpath}/key.pem'
|
chmod ${rights} "${cpath}/"{key,fullchain,full}.pem
|
||||||
chmod ${rights} '${cpath}/fullchain.pem'
|
|
||||||
chown '${data.user}:${data.group}' '${cpath}/fullchain.pem'
|
|
||||||
chmod ${rights} '${cpath}/full.pem'
|
|
||||||
chown '${data.user}:${data.group}' '${cpath}/full.pem'
|
|
||||||
'';
|
'';
|
||||||
serviceConfig = {
|
serviceConfig = {
|
||||||
Type = "oneshot";
|
Type = "oneshot";
|
||||||
RuntimeDirectory = "acme-selfsigned-${cert}";
|
|
||||||
PermissionsStartOnly = true;
|
PermissionsStartOnly = true;
|
||||||
|
PrivateTmp = true;
|
||||||
User = data.user;
|
User = data.user;
|
||||||
Group = data.group;
|
Group = data.group;
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user