Skip to content

Commit 435b638

Browse files
feat/mtls-support-cert-script
1 parent 9b3c826 commit 435b638

File tree

2 files changed

+129
-1
lines changed

2 files changed

+129
-1
lines changed

.gitignore

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
newt
22
.DS_Store
3-
bin/
3+
bin/
4+
.idea
5+
*.iml
6+
certs/

self-signed-certs-for-mtls.sh

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#!/usr/bin/env bash
2+
set -eu
3+
4+
echo -n "Enter username for certs (eg alice): "
5+
read CERT_USERNAME
6+
echo
7+
8+
echo -n "Enter domain of user (eg example.com): "
9+
read DOMAIN
10+
echo
11+
12+
# Prompt for password at the start
13+
echo -n "Enter password for certificate: "
14+
read -s PASSWORD
15+
echo
16+
echo -n "Confirm password: "
17+
read -s PASSWORD2
18+
echo
19+
20+
if [ "$PASSWORD" != "$PASSWORD2" ]; then
21+
echo "Passwords don't match!"
22+
exit 1
23+
fi
24+
CA_DIR="./certs/ca"
25+
CLIENT_DIR="./certs/clients"
26+
FILE_PREFIX=$(echo "$CERT_USERNAME-at-$DOMAIN" | sed 's/\./-/')
27+
28+
mkdir -p "$CA_DIR"
29+
mkdir -p "$CLIENT_DIR"
30+
31+
if [ ! -f "$CA_DIR/ca.crt" ]; then
32+
# Generate CA private key
33+
openssl genrsa -out "$CA_DIR/ca.key" 4096
34+
echo "CA key ✅"
35+
36+
# Generate CA root certificate
37+
openssl req -x509 -new -nodes \
38+
-key "$CA_DIR/ca.key" \
39+
-sha256 \
40+
-days 3650 \
41+
-out "$CA_DIR/ca.crt" \
42+
-subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=ca.$DOMAIN"
43+
44+
echo "CA cert ✅"
45+
fi
46+
47+
# Generate client private key
48+
openssl genrsa -aes256 -passout pass:"$PASSWORD" -out "$CLIENT_DIR/$FILE_PREFIX.key" 2048
49+
echo "Client key ✅"
50+
51+
# Generate client Certificate Signing Request (CSR)
52+
openssl req -new \
53+
-key "$CLIENT_DIR/$FILE_PREFIX.key" \
54+
-out "$CLIENT_DIR/$FILE_PREFIX.csr" \
55+
-passin pass:"$PASSWORD" \
56+
-subj "/C=US/ST=State/L=City/O=Organization/OU=Unit/CN=$CERT_USERNAME@$DOMAIN"
57+
echo "Client cert ✅"
58+
59+
echo -n "Signing client cert..."
60+
# Create client certificate configuration file
61+
cat > "$CLIENT_DIR/$FILE_PREFIX.ext" << EOF
62+
authorityKeyIdentifier=keyid,issuer
63+
basicConstraints=CA:FALSE
64+
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
65+
subjectAltName = @alt_names
66+
67+
[alt_names]
68+
DNS.1 = $DOMAIN
69+
EOF
70+
71+
# Generate client certificate signed by CA
72+
openssl x509 -req \
73+
-in "$CLIENT_DIR/$FILE_PREFIX.csr" \
74+
-CA "$CA_DIR/ca.crt" \
75+
-CAkey "$CA_DIR/ca.key" \
76+
-CAcreateserial \
77+
-out "$CLIENT_DIR/$FILE_PREFIX.crt" \
78+
-days 365 \
79+
-sha256 \
80+
-extfile "$CLIENT_DIR/$FILE_PREFIX.ext"
81+
82+
# Verify the client certificate
83+
openssl verify -CAfile "$CA_DIR/ca.crt" "$CLIENT_DIR/$FILE_PREFIX.crt"
84+
echo "Signed ✅"
85+
86+
# Create encrypted PEM bundle
87+
openssl rsa -in "$CLIENT_DIR/$FILE_PREFIX.key" -passin pass:"$PASSWORD" \
88+
| cat "$CLIENT_DIR/$FILE_PREFIX.crt" - > "$CLIENT_DIR/$FILE_PREFIX-bundle.enc.pem"
89+
90+
91+
# Convert to PKCS12
92+
echo "Converting to PKCS12 format..."
93+
openssl pkcs12 -export \
94+
-out "$CLIENT_DIR/$FILE_PREFIX.enc.p12" \
95+
-inkey "$CLIENT_DIR/$FILE_PREFIX.key" \
96+
-in "$CLIENT_DIR/$FILE_PREFIX.crt" \
97+
-certfile "$CA_DIR/ca.crt" \
98+
-name "$CERT_USERNAME@$DOMAIN" \
99+
-passin pass:"$PASSWORD" \
100+
-passout pass:"$PASSWORD"
101+
echo "Converted to encrypted p12 for macOS ✅"
102+
103+
# Convert to PKCS12 format without encryption
104+
echo "Converting to non-encrypted PKCS12 format..."
105+
openssl pkcs12 -export \
106+
-out "$CLIENT_DIR/$FILE_PREFIX.p12" \
107+
-inkey "$CLIENT_DIR/$FILE_PREFIX.key" \
108+
-in "$CLIENT_DIR/$FILE_PREFIX.crt" \
109+
-certfile "$CA_DIR/ca.crt" \
110+
-name "$CERT_USERNAME@$DOMAIN" \
111+
-passin pass:"$PASSWORD" \
112+
-passout pass:""
113+
echo "Converted to non-encrypted p12 ✅"
114+
115+
# Clean up intermediate files
116+
rm "$CLIENT_DIR/$FILE_PREFIX.csr" "$CLIENT_DIR/$FILE_PREFIX.ext" "$CA_DIR/ca.srl"
117+
echo
118+
echo
119+
120+
echo "CA certificate: $CA_DIR/ca.crt"
121+
echo "CA private key: $CA_DIR/ca.key"
122+
echo "Client certificate: $CLIENT_DIR/$FILE_PREFIX.crt"
123+
echo "Client private key: $CLIENT_DIR/$FILE_PREFIX.key"
124+
echo "Client cert bundle: $CLIENT_DIR/$FILE_PREFIX.p12"
125+
echo "Client cert bundle (encrypted): $CLIENT_DIR/$FILE_PREFIX.enc.p12"

0 commit comments

Comments
 (0)