|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +LOCAL_ROOT_CA="iaca.pem" |
| 4 | +LOCAL_ROOT_CA_KEY="iaca.key" |
| 5 | + |
| 6 | +function install_certificates() { |
| 7 | + echo Installing keys/certificates... |
| 8 | + PRIVKEY_DIR=/etc/eudiw/pid-issuer/privKey/ |
| 9 | + CERT_DIR=/etc/eudiw/pid-issuer/cert/ |
| 10 | + sudo mkdir -p ${PRIVKEY_DIR} |
| 11 | + sudo mkdir -p ${CERT_DIR} |
| 12 | + sudo chmod +rx /etc/eudiw |
| 13 | + sudo chmod +rx /etc/eudiw/pid-issuer |
| 14 | + sudo chmod +rx ${PRIVKEY_DIR} |
| 15 | + sudo chmod +rx ${CERT_DIR} |
| 16 | + |
| 17 | + echo Copying signing certificates... |
| 18 | + sudo unzip -o api_docs/test_tokens/DS-token/PID-DS-0002.zip -d ${PRIVKEY_DIR} |
| 19 | + sudo mv ${PRIVKEY_DIR}/PID-DS-0002.cert.der ${CERT_DIR}/ |
| 20 | + sudo chmod +r ${PRIVKEY_DIR}* |
| 21 | + sudo cp ${LOCAL_ADDR}.crt.der ${CERT_DIR}/ |
| 22 | + sudo chmod +r ${CERT_DIR}/${LOCAL_ADDR}.crt.der |
| 23 | + sudo cp ${LOCAL_ADDR}.key ${PRIVKEY_DIR}/ |
| 24 | + sudo chmod +r ${PRIVKEY_DIR}/${LOCAL_ADDR}.key |
| 25 | + |
| 26 | + echo Copying IACA files... |
| 27 | + gunzip -f -k api_docs/test_tokens/IACA-token/PIDIssuerCAUT01.pem.gz |
| 28 | + sudo mkdir -p /etc/eudiw/pid-issuer/cert/ |
| 29 | + sudo chmod +rx /etc/eudiw/pid-issuer/cert/ |
| 30 | + sudo cp api_docs/test_tokens/IACA-token/PIDIssuerCAUT01.pem /etc/eudiw/pid-issuer/cert/ |
| 31 | + if [ -f "${LOCAL_ROOT_CA}" ]; then |
| 32 | + sudo cp "${LOCAL_ROOT_CA}" /etc/eudiw/pid-issuer/cert/ |
| 33 | + fi |
| 34 | +} |
| 35 | + |
| 36 | +function generate_config_file() |
| 37 | +{ |
| 38 | + cat << EOF |
| 39 | +[req] |
| 40 | +default_bits = 2048 |
| 41 | +distinguished_name = req_distinguished_name |
| 42 | +req_extensions = req_ext |
| 43 | +x509_extensions = v3_req |
| 44 | +prompt = no |
| 45 | +
|
| 46 | +[req_ext] |
| 47 | +subjectAltName = @alt_names |
| 48 | +
|
| 49 | +[req_distinguished_name] |
| 50 | +countryName = GR |
| 51 | +stateOrProvinceName = Attica |
| 52 | +localityName = N/A |
| 53 | +organizationName = GRNET |
| 54 | +commonName = GRNET-Issuer |
| 55 | +
|
| 56 | +[v3_ca] |
| 57 | +authorityKeyIdentifier=keyid,issuer:always |
| 58 | +basicConstraints=critical,CA:FALSE |
| 59 | +keyUsage = critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment |
| 60 | +extendedKeyUsage = serverAuth, clientAuth, codeSigning, emailProtection |
| 61 | +
|
| 62 | +[v3_req] |
| 63 | +subjectAltName = @alt_names |
| 64 | +
|
| 65 | +[alt_names] |
| 66 | +IP.1 = ${LOCAL_ADDR} |
| 67 | +EOF |
| 68 | +} |
| 69 | + |
| 70 | +function generate_ssl_certificate() { |
| 71 | + echo "== Generating SSL certificate configuration ==" |
| 72 | + config_file=$(mktemp) |
| 73 | + echo "Using temporary configuration in ${config_file}" |
| 74 | + generate_config_file > ${config_file} |
| 75 | + cat ${config_file} |
| 76 | + |
| 77 | + if [ -f "${LOCAL_ROOT_CA}" ] && [ -f "${LOCAL_ROOT_CA_KEY}" ]; then |
| 78 | + CUSTOM_ROOT_CA=1 |
| 79 | + else |
| 80 | + CUSTOM_ROOT_CA=0 |
| 81 | + fi |
| 82 | + |
| 83 | + # No local root CA available, create a simple self-signed certificate |
| 84 | + if [ $CUSTOM_ROOT_CA -eq 0 ]; then |
| 85 | + openssl req -x509 -nodes -days 730 \ |
| 86 | + -newkey rsa:2048 \ |
| 87 | + -keyout ${KEY} \ |
| 88 | + -out ${CRT} \ |
| 89 | + -config "$config_file" |
| 90 | + return |
| 91 | + fi |
| 92 | + |
| 93 | + # Local root CA available, create a certificate signed by it |
| 94 | + echo "== Creating key ==" |
| 95 | + KEY="key.pem" |
| 96 | + openssl genrsa -out ${KEY} 2048 |
| 97 | + |
| 98 | + echo "== Creating SSL certificate signing request ==" |
| 99 | + CSR="cert.csr" |
| 100 | + rm -f ${CSR} |
| 101 | + openssl req -new -sha256 -key ${KEY} \ |
| 102 | + -subj "/CN=${LOCAL_ADDR}/O=GRNET/C=GR" \ |
| 103 | + -out ${CSR} |
| 104 | + |
| 105 | + echo "== Verifying the request ==" |
| 106 | + openssl req -in ${CSR} -noout -text |
| 107 | + |
| 108 | + echo "== Generating the SSL certificate ==" |
| 109 | + CRT="cert.pem" |
| 110 | + openssl x509 -req -in ${CSR} -CA ${LOCAL_ROOT_CA} -CAkey ${LOCAL_ROOT_CA_KEY} -out ${CRT} -days 400 -sha256 -extfile "${config_file}" -extensions v3_req |
| 111 | + rm -f ${config_file} |
| 112 | + |
| 113 | + |
| 114 | + if [ $CUSTOM_ROOT_CA -eq 1 ]; then |
| 115 | + echo "== Verifying the certificate using root CA ${LOCAL_ROOT_CA} ==" |
| 116 | + openssl verify -CAfile ${LOCAL_ROOT_CA} -purpose sslserver -verify_ip ${LOCAL_ADDR} ${CRT} |
| 117 | + fi |
| 118 | +} |
| 119 | + |
| 120 | +if [ "$1" == "-h" ]; then |
| 121 | + echo "Set up the certificate of the issuer" |
| 122 | + echo "Usage: setup-cert.sh [LOCAL_IP]" |
| 123 | + exit |
| 124 | +elif [ "$1" == "" ]; then |
| 125 | + echo $(./resolve-ip.sh) > .config.ip |
| 126 | +else |
| 127 | + echo $1 > .config.ip |
| 128 | +fi |
| 129 | + |
| 130 | +LOCAL_ADDR=$(cat .config.ip) |
| 131 | +echo "Using local address: ${LOCAL_ADDR}" |
| 132 | + |
| 133 | +generate_ssl_certificate |
| 134 | +scripts/create-issuer-mdl-cert.sh ${LOCAL_ADDR} |
| 135 | + |
| 136 | +install_certificates |
| 137 | + |
| 138 | +echo |
| 139 | +echo "mdoc certificate created, set the following options in app/app_config/config_countries.py:" |
| 140 | +echo '"pid_mdoc_privkey": "/etc/eudiw/pid-issuer/privKey/'${LOCAL_ADDR}'.key"' |
| 141 | +echo '"pid_mdoc_privkey_passwd": None' |
| 142 | +echo '"pid_mdoc_cert": "/etc/eudiw/pid-issuer/cert/'${LOCAL_ADDR}'.crt.der"' |
| 143 | +echo |
0 commit comments