-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathpki.sh
135 lines (121 loc) · 3.61 KB
/
pki.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
TARGET_DIR_DEFAULT=./pki
set -e
verify_openssl() {
openssl version > /dev/null || (echo "ERROR: could not find an openssl executable" && exit 1)
}
print_usage() {
local DESCRIPTION="generate one or more of the following, using OpenSSL and a private key:
\t * CA certificate
\t * Server private key and certificate, signed by CA
\t * Client private key and certificate, signed by CA
\t generated files are in PEM format. each file has a twin in DER format, with .der prefix.
"
local USAGE="${0} [options] ca|server|client (multiple arguments supported)"
local OPTIONS=(
"-h, --help \t\t print usage and exit"
"-k, --private_key \t private key file (e.g. SSH RSA key) that will be used as CA key"
"-t, --target_dir \t generated files directory (default: ${TARGET_DIR_DEFAULT})"
"-x, --xtrace \t\t set xtrace flag"
)
printf 'Description:\n \t %b\n' "${DESCRIPTION}"
printf 'Usage:\n \t %b\n' "${USAGE}"
printf 'Options:\n'
printf '\t %b\n' "${OPTIONS[@]}"
}
parse_flags() {
while [[ $# -gt 0 ]]; do
case $1 in
-h | --help)
print_usage && exit 0
;;
-k | --private_key)
test -f "$2" || (echo "ERROR: please provide an existing CA private key path" && exit 1)
CA_PRIVATE_KEY_PATH=$2
shift 2
;;
-t | --target_dir)
test -d "$2" || (echo "ERROR: please provide an existing target directory path" && exit 1)
TARGET_DIR=$2
shift 2
;;
ca)
GENERATE_CA=true
shift
;;
server)
GENERATE_SERVER=true
shift
;;
client)
GENERATE_CLIENT=true
shift
;;
-x | --xtrace)
set -x
shift
;;
*)
echo "ERROR: unknown option ${1}" && print_usage && exit 1
;;
esac
done
if [[ -z ${CA_PRIVATE_KEY_PATH} ]]; then
echo "ERROR: CA private key path must be provided" && print_usage && exit 1
fi
if [[ -z ${TARGET_DIR} ]]; then
TARGET_DIR=${TARGET_DIR_DEFAULT}
fi
}
verify_openssl
parse_flags "$@"
if [[ -n ${GENERATE_CA} ]]; then
openssl req -nodes \
-x509 \
-days 3650 \
-key "$CA_PRIVATE_KEY_PATH" \
-out $TARGET_DIR/ca.crt \
-sha256 \
-batch \
-subj "/CN=Tunneler CA" \
-extensions v3_ca \
-config openssl.cnf
fi
if [[ -n ${GENERATE_SERVER} ]]; then
openssl req -nodes \
-newkey rsa:2048 \
-keyout $TARGET_DIR/server.key \
-out $TARGET_DIR/server.req \
-sha256 \
-batch \
-subj "/CN=Tunneler Server"
openssl x509 -req \
-in $TARGET_DIR/server.req \
-out $TARGET_DIR/server.crt \
-CA $TARGET_DIR/ca.crt \
-CAkey "$CA_PRIVATE_KEY_PATH" \
-sha256 \
-days 365 \
-set_serial 1 \
-extensions v3_server \
-extfile openssl.cnf
fi
if [[ -n ${GENERATE_CLIENT} ]]; then
openssl req -nodes \
-newkey rsa:2048 \
-keyout $TARGET_DIR/client.key \
-out $TARGET_DIR/client.req \
-sha256 \
-batch \
-subj "/CN=Tunneler Client"
openssl x509 -req \
-in $TARGET_DIR/client.req \
-out $TARGET_DIR/client.crt \
-CA $TARGET_DIR/ca.crt \
-CAkey "$CA_PRIVATE_KEY_PATH" \
-sha256 \
-days 365 \
-set_serial 2 \
-extensions v3_client \
-extfile openssl.cnf
fi