Add script to generate certs for local development
This commit is contained in:
174
cmd/hub/gencerts.sh
Executable file
174
cmd/hub/gencerts.sh
Executable file
@@ -0,0 +1,174 @@
|
|||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i bash --pure
|
||||||
|
#! nix-shell -p bash cfssl openssl
|
||||||
|
#! nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/4ecab3273592f27479a583fb6d975d4aba3486fe.tar.gz
|
||||||
|
|
||||||
|
|
||||||
|
TMPDIR=$(mktemp -d)
|
||||||
|
OUTDIR="./.certs"
|
||||||
|
ca="ca"
|
||||||
|
ca_csr="${TMPDIR}/ca.json"
|
||||||
|
ca_config="${TMPDIR}/ca-config.json"
|
||||||
|
|
||||||
|
|
||||||
|
key_algo=rsa
|
||||||
|
key_size=2048
|
||||||
|
cert_expire=43800 # = 5 years * 365 days * 24 hours
|
||||||
|
|
||||||
|
C="US"
|
||||||
|
L="PA"
|
||||||
|
O="Equinix Metal Development"
|
||||||
|
OU="Nautilus"
|
||||||
|
ST="Philadelphia"
|
||||||
|
|
||||||
|
cat <<-EOFCACONFIG > ${ca_config}
|
||||||
|
{
|
||||||
|
"signing": {
|
||||||
|
"default": {
|
||||||
|
"expiry": "${cert_expire}h"
|
||||||
|
},
|
||||||
|
"profiles": {
|
||||||
|
"server": {
|
||||||
|
"expiry": "${cert_expire}h",
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"client": {
|
||||||
|
"expiry": "${cert_expire}h",
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"client auth"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"client-server": {
|
||||||
|
"expiry": "${cert_expire}h",
|
||||||
|
"usages": [
|
||||||
|
"signing",
|
||||||
|
"key encipherment",
|
||||||
|
"server auth",
|
||||||
|
"client auth"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOFCACONFIG
|
||||||
|
|
||||||
|
function generate_ca {
|
||||||
|
echo "==================== generating self-signed CA key pair"
|
||||||
|
|
||||||
|
cat <<-EOFCACSR > ${ca_csr}
|
||||||
|
{
|
||||||
|
"CN": "Nautilus Local CA",
|
||||||
|
"key": {
|
||||||
|
"algo": "${key_algo}",
|
||||||
|
"size": ${key_size}
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"C": "${C}",
|
||||||
|
"L": "${L}",
|
||||||
|
"O": "${O}",
|
||||||
|
"ST": "${ST}",
|
||||||
|
"OU": "${OU}"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOFCACSR
|
||||||
|
|
||||||
|
cfssl gencert -initca "${ca_csr}" | cfssljson -bare ${ca}
|
||||||
|
mv "${ca}.pem" "${OUTDIR}/${ca}.pem"
|
||||||
|
mv "${ca}-key.pem" "${OUTDIR}/${ca}-key.pem"
|
||||||
|
}
|
||||||
|
|
||||||
|
function generate_server_certificate {
|
||||||
|
echo "=================== generating server certificate"
|
||||||
|
|
||||||
|
server_csr="${TMPDIR}/server-csr.json"
|
||||||
|
cat <<EOF > ${server_csr}
|
||||||
|
{
|
||||||
|
"CN": "Nautilus Hub",
|
||||||
|
"hosts": [ "localhost", "hub.example.net" ],
|
||||||
|
"key": {
|
||||||
|
"algo": "${key_algo}",
|
||||||
|
"size": ${key_size}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cfssl gencert -ca="${OUTDIR}/${ca}.pem" -ca-key="${OUTDIR}/${ca}-key.pem" -config="${ca_config}" -profile=client-server ${server_csr} | cfssljson -bare server
|
||||||
|
}
|
||||||
|
|
||||||
|
function generate_client_certificate {
|
||||||
|
echo "================== generating client certificate"
|
||||||
|
|
||||||
|
client_csr="${TMPDIR}/client-csr.json"
|
||||||
|
cat <<EOF > ${client_csr}
|
||||||
|
{
|
||||||
|
"CN": "Nautilus Spoke 1",
|
||||||
|
"hosts": [ "localhost", "spoke1.example.net" ],
|
||||||
|
"key": {
|
||||||
|
"algo": "${key_algo}",
|
||||||
|
"size": ${key_size}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
cfssl gencert -ca="${OUTDIR}/${ca}.pem" -ca-key="${OUTDIR}/${ca}-key.pem" -config="${ca_config}" -profile=client ${client_csr} | cfssljson -bare client
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function generate_admin_certificate {
|
||||||
|
echo "================= generating admin certificate"
|
||||||
|
|
||||||
|
admin_csr="${TMPDIR}/admin-csr.json"
|
||||||
|
cat <<EOF > ${admin_csr}
|
||||||
|
{
|
||||||
|
"CN": "Nautilus Admin - Adam",
|
||||||
|
"key": {
|
||||||
|
"algo": "${key_algo}",
|
||||||
|
"size": ${key_size}
|
||||||
|
},
|
||||||
|
"names": [
|
||||||
|
{
|
||||||
|
"C": "${C}",
|
||||||
|
"L": "${L}",
|
||||||
|
"O": "${O}",
|
||||||
|
"ST": "${ST}",
|
||||||
|
"OU": "Nautilus Admins"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
cfssl gencert -ca="${OUTDIR}/${ca}.pem" -ca-key="${OUTDIR}/${ca}-key.pem" -config="${ca_config}" -profile=client ${admin_csr} | cfssljson -bare admin
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function move_certs {
|
||||||
|
echo "================ copying certificates to ${OUTDIR}"
|
||||||
|
for c in server client admin; do
|
||||||
|
[[ -f "${c}-key.pem" ]] && mv "${c}-key.pem" "${OUTDIR}/${c}-key.pem" || echo "${c}-key.pem not regenerated"
|
||||||
|
[[ -f "${c}.pem" ]] && mv "${c}.pem" "${OUTDIR}/${c}.pem" || echo "${c}.pem not regenerated"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function main {
|
||||||
|
mkdir -p "${OUTDIR}"
|
||||||
|
|
||||||
|
[[ -f "${OUTDIR}/ca.pem" ]] || generate_ca
|
||||||
|
[[ -f "${OUTDIR}/server.pem" ]] || generate_server_certificate
|
||||||
|
[[ -f "${OUTDIR}/client.pem" ]] || generate_client_certificate
|
||||||
|
[[ -f "${OUTDIR}/admin.pem" ]] || generate_admin_certificate
|
||||||
|
move_certs
|
||||||
|
|
||||||
|
rm {ca,server,admin,client}.csr 2>/dev/null
|
||||||
|
|
||||||
|
chmod 600 ${OUTDIR}/*-key.pem
|
||||||
|
}
|
||||||
|
|
||||||
|
main
|
||||||
Reference in New Issue
Block a user