#!/bin/sh # env # Written in 2022 by Lucas # CC0 1.0 Universal/Public domain - No rights reserved # # To the extent possible under law, the author(s) have dedicated all # copyright and related and neighboring rights to this software to the # public domain worldwide. This software is distributed without any # warranty. You should have received a copy of the CC0 Public Domain # Dedication along with this software. If not, see # . usage() { cat - <&2 Usage: ${0##*/} [-h] [-n principals] [-V validity_interval] [-z serial_number] key ... EOF exit 1 } _cleanup() { eval $(ssh-agent -ks) rm -Pfr -- "$T" } hflag= nflag= Vflag= zflag= while getopts hn:V:z: flag; do case $flag in h) hflag=-h ;; n) nflag=$OPTARG ;; V) Vflag=$OPTARG ;; z) zflag=$OPTARG ;; *) usage ;; esac done shift $(($OPTIND - 1)) [ $# -gt 0 ] || usage T=$(mktemp -d) || exit 1 trap _cleanup EXIT INT QUIT TERM yyyymmdd=$(date +%Y%m%d) if [ -n "$hflag" ]; then cafile=~/.ssh/keys/hostca outfile=hostca-signed-keys.tgz else cafile=~/.ssh/keys/userca outfile=userca-signed-keys.tgz fi id=$(ssh-keygen -lf "$cafile.pub" | cut -d " " -f 3-) id=${id% (*)} if [ -z "$id" ]; then id=${cafile##*/}-$yyyymmdd fi eval $(ssh-agent -s) ssh-add "$cafile" for arg; do mkdir -p "$T/$arg" if [ -n "$hflag" ]; then f=$T/$arg/ssh_host_ed25519_key else f=$T/$arg/id_ed25519 fi comment=$arg-infra-$yyyymmdd principals=${nflag:-$arg} if [ -n "$hflag" ]; then principals=$principals,localhost fi ssh-keygen -q -t ed25519 -C "$comment" -f "$f" ${hflag:+-N ""} && ssh-keygen -Us "$cafile.pub" -I "$id" $hflag -n "$principals" \ ${Vflag:+-V "$Vflag"} ${zflag:+-z "$zflag"} "$f.pub" if [ $? -ne 0 ]; then rm -Pfr -- "$T/$arg" exit 1 fi done (cd "$T" && pax -w .) | gzip >"$outfile"