Blame


1 d7e2e22c 2021-10-09 op #!/bin/sh
2 d7e2e22c 2021-10-09 op #
3 d7e2e22c 2021-10-09 op # NAME
4 d7e2e22c 2021-10-09 op # gencert - generate certificates
5 d7e2e22c 2021-10-09 op #
6 d7e2e22c 2021-10-09 op # SYNOPSIS
7 ac9f55ba 2023-06-05 op # ./gencert [-efh] [-D days] [-d destdir] hostname
8 d7e2e22c 2021-10-09 op #
9 d7e2e22c 2021-10-09 op # DESCRIPTION
10 d7e2e22c 2021-10-09 op # A simple script to generate self-signed X.509 certificates for
11 d7e2e22c 2021-10-09 op # gmid.
12 d7e2e22c 2021-10-09 op #
13 d7e2e22c 2021-10-09 op # The option are as follows:
14 d7e2e22c 2021-10-09 op # -D Specify the number of days the certificate
15 d7e2e22c 2021-10-09 op # will be valid for. Use 365 (a year) by default.
16 d7e2e22c 2021-10-09 op # -d Save the certificates to the given directory.
17 d7e2e22c 2021-10-09 op # By default the current directory is used.
18 ac9f55ba 2023-06-05 op # -e Use an EC key instead of RSA.
19 d7e2e22c 2021-10-09 op # -f Forcefully overwrite existing certificates
20 d7e2e22c 2021-10-09 op # without prompting.
21 d7e2e22c 2021-10-09 op # -h Display usage and exit.
22 d7e2e22c 2021-10-09 op #
23 d7e2e22c 2021-10-09 op # SEE ALSO
24 d7e2e22c 2021-10-09 op # openssl(1)
25 d7e2e22c 2021-10-09 op #
26 d7e2e22c 2021-10-09 op
27 d7e2e22c 2021-10-09 op progname="$(basename -- "$0")"
28 d7e2e22c 2021-10-09 op
29 d7e2e22c 2021-10-09 op usage() {
30 1218bca6 2023-08-29 op echo "usage: $progname [-fhe] [-d destdir] [-D days] hostname" >&2
31 d7e2e22c 2021-10-09 op echo "Please read the comment at the top of $0 for the usage." >&2
32 d7e2e22c 2021-10-09 op exit $1
33 d7e2e22c 2021-10-09 op }
34 d7e2e22c 2021-10-09 op
35 ac9f55ba 2023-06-05 op ec=no
36 d7e2e22c 2021-10-09 op force=no
37 d7e2e22c 2021-10-09 op destdir=.
38 d7e2e22c 2021-10-09 op days=365
39 d7e2e22c 2021-10-09 op
40 ac9f55ba 2023-06-05 op while getopts "D:d:efh" flag; do
41 d7e2e22c 2021-10-09 op case $flag in
42 d7e2e22c 2021-10-09 op D) days="$OPTARG" ;;
43 d7e2e22c 2021-10-09 op d) destdir="${OPTARG%/}" ;;
44 ac9f55ba 2023-06-05 op e) ec=yes ;;
45 d7e2e22c 2021-10-09 op f) force=yes ;;
46 d7e2e22c 2021-10-09 op h) usage 0 ;;
47 d7e2e22c 2021-10-09 op ?) usage 1 ;;
48 d7e2e22c 2021-10-09 op esac
49 d7e2e22c 2021-10-09 op done
50 d7e2e22c 2021-10-09 op
51 d7e2e22c 2021-10-09 op shift $(($OPTIND - 1))
52 d7e2e22c 2021-10-09 op
53 d7e2e22c 2021-10-09 op if [ $# -ne 1 ]; then
54 d7e2e22c 2021-10-09 op usage 1
55 d7e2e22c 2021-10-09 op fi
56 d7e2e22c 2021-10-09 op
57 d7e2e22c 2021-10-09 op if [ ! -d "${destdir}" ]; then
58 d7e2e22c 2021-10-09 op echo "${progname}: ${destdir} is not a directory." >&2
59 d7e2e22c 2021-10-09 op usage 1
60 d7e2e22c 2021-10-09 op fi
61 d7e2e22c 2021-10-09 op
62 d7e2e22c 2021-10-09 op hostname="${1}"
63 d7e2e22c 2021-10-09 op pem="${destdir}/${hostname}.pem"
64 d7e2e22c 2021-10-09 op key="${destdir}/${hostname}.key"
65 d7e2e22c 2021-10-09 op
66 d7e2e22c 2021-10-09 op if [ -f "$pem" -o -f "$key" ]; then
67 d7e2e22c 2021-10-09 op if [ $force = no ]; then
68 d7e2e22c 2021-10-09 op while :; do
69 d7e2e22c 2021-10-09 op printf "Overwrite existing certificate $pem? [y/n] "
70 d7e2e22c 2021-10-09 op if ! read -r reply; then
71 d7e2e22c 2021-10-09 op echo
72 d7e2e22c 2021-10-09 op exit 1
73 d7e2e22c 2021-10-09 op fi
74 d7e2e22c 2021-10-09 op case "$reply" in
75 d7e2e22c 2021-10-09 op [yY]) echo "overwriting"; break ;;
76 d7e2e22c 2021-10-09 op [nN]) echo "quitting"; exit 0 ;;
77 d7e2e22c 2021-10-09 op esac
78 d7e2e22c 2021-10-09 op done
79 d7e2e22c 2021-10-09 op fi
80 d7e2e22c 2021-10-09 op fi
81 d7e2e22c 2021-10-09 op
82 ac9f55ba 2023-06-05 op if [ $ec = yes ]; then
83 892f3a5c 2023-06-09 op openssl ecparam -name secp384r1 -genkey -noout -out "${key}" && \
84 ac9f55ba 2023-06-05 op openssl req -new -x509 -key "${key}" -out "${pem}" -days "${days}" \
85 ac9f55ba 2023-06-05 op -nodes -subj "/CN=$hostname"
86 ac9f55ba 2023-06-05 op else
87 ac9f55ba 2023-06-05 op openssl req -x509 \
88 ac9f55ba 2023-06-05 op -newkey rsa:4096 \
89 ac9f55ba 2023-06-05 op -out "${pem}" \
90 ac9f55ba 2023-06-05 op -keyout "${key}" \
91 ac9f55ba 2023-06-05 op -days "${days}" \
92 ac9f55ba 2023-06-05 op -nodes \
93 ac9f55ba 2023-06-05 op -subj "/CN=$hostname"
94 ac9f55ba 2023-06-05 op fi
95 d7e2e22c 2021-10-09 op
96 d7e2e22c 2021-10-09 op e=$?
97 d7e2e22c 2021-10-09 op if [ $e -ne 0 ]; then
98 d7e2e22c 2021-10-09 op exit $e
99 d7e2e22c 2021-10-09 op fi
100 d7e2e22c 2021-10-09 op
101 d7e2e22c 2021-10-09 op echo
102 d7e2e22c 2021-10-09 op echo "Generated files:"
103 d7e2e22c 2021-10-09 op echo " $pem : certificate"
104 d7e2e22c 2021-10-09 op echo " $key : private key"