#!/bin/bash -xe hostname=$(hostname -f) issuer=$(hostname -d) ca="$issuer-ca" chain="$issuer-chain" rm -rf ca mkdir -p ca cd ca # generate root ca mkdir -p certs crl newcerts private chmod 700 private touch index.txt echo 1000 > serial cat > openssl.cnf <. countryName = US stateOrProvinceName = OR localityName = Hillsboro 0.organizationName = Intel Corporation organizationalUnitName = NPG commonName = Common Name emailAddress = nobody@intel.com [ v3_ca ] # Extensions for a typical CA (man x509v3_config). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ v3_intermediate_ca ] # Extensions for a typical intermediate CA (man x509v3_config). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ usr_cert ] # Extensions for client certificates (man x509v3_config). basicConstraints = CA:FALSE nsCertType = client, email nsComment = "OpenSSL Generated Client Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, emailProtection [ server_cert ] # Extensions for server certificates (man x509v3_config). basicConstraints = CA:FALSE nsCertType = server nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth [ crl_ext ] # Extension for CRLs (man x509v3_config). authorityKeyIdentifier=keyid:always [ ocsp ] # Extension for OCSP signing certificates (man ocsp). basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature extendedKeyUsage = critical, OCSPSigning EOF openssl genrsa -out private/$ca.key.pem 4096 openssl req -config openssl.cnf -key private/$ca.key.pem -new -x509 -days 7300 -sha256 -extensions v3_ca -out certs/$ca.cert.pem -subj "/C=US/ST=OR/O=Intel/CN=$ca" chmod 444 certs/$ca.cert.pem # generate intermediate cert mkdir -p $issuer cd $issuer mkdir -p certs crl csr newcerts private chmod 700 private touch index.txt echo 1000 > serial echo 1000 > crlnumber cat > openssl.cnf <. countryName = Country Name (2 letter code) stateOrProvinceName = State or Province Name localityName = Locality Name 0.organizationName = Organization Name organizationalUnitName = Organizational Unit Name commonName = Common Name emailAddress = Email Address # Optionally, specify some defaults. countryName_default = GB stateOrProvinceName_default = England localityName_default = 0.organizationName_default = Alice Ltd organizationalUnitName_default = emailAddress_default = [ v3_ca ] # Extensions for a typical CA (man x509v3_config). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ v3_intermediate_ca ] # Extensions for a typical intermediate CA (man x509v3_config). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ usr_cert ] # Extensions for client certificates (man x509v3_config). basicConstraints = CA:FALSE nsCertType = client, email nsComment = "OpenSSL Generated Client Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, emailProtection [ server_cert ] # Extensions for server certificates (man x509v3_config). basicConstraints = CA:FALSE nsCertType = server nsComment = "OpenSSL Generated Server Certificate" subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer:always keyUsage = critical, digitalSignature, keyEncipherment, dataEncipherment, nonRepudiation extendedKeyUsage = serverAuth subjectAltName = DNS:$(hostname -f), DNS:$(hostname) [ crl_ext ] # Extension for CRLs (man x509v3_config). authorityKeyIdentifier=keyid:always [ ocsp ] # Extension for OCSP signing certificates (man ocsp). basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature extendedKeyUsage = critical, OCSPSigning EOF openssl genrsa -out private/$issuer.key.pem 4096 chmod 400 private/$issuer.key.pem openssl req -config openssl.cnf -new -sha256 -key private/$issuer.key.pem -out csr/$issuer.csr.pem -subj "/C=US/ST=OR/O=Intel/CN=$issuer" cd .. yes | openssl ca -config openssl.cnf -extensions v3_intermediate_ca -days 3650 -notext -md sha256 -in $issuer/csr/$issuer.csr.pem -out $issuer/certs/$issuer.cert.pem chmod 444 $issuer/certs/$issuer.cert.pem # generate a certificate chain cat $issuer/certs/$issuer.cert.pem certs/$ca.cert.pem > $issuer/certs/$chain.cert.pem openssl x509 -outform pem -in $issuer/certs/$issuer.cert.pem -out $issuer/certs/$issuer.cert.crt openssl x509 -outform pem -in certs/$ca.cert.pem -out certs/$ca.cert.crt # generate a server certificate openssl genrsa -out $issuer/private/$hostname.key.pem 2048 chmod 400 $issuer/private/$hostname.key.pem openssl req -config $issuer/openssl.cnf -key $issuer/private/$hostname.key.pem -new -sha256 -out $issuer/csr/$hostname.csr.pem -subj "/C=US/ST=OR/O=Intel/CN=$hostname" yes | openssl ca -config $issuer/openssl.cnf -extensions server_cert -days 375 -notext -md sha256 -in $issuer/csr/$hostname.csr.pem -out $issuer/certs/$hostname.cert.pem chmod 444 $issuer/certs/$hostname.cert.pem echo echo "chain: $(pwd)/$issuer/certs/$chain.cert.pem" echo "cert: $(pwd)/$issuer/certs/$hostname.cert.pem" echo "key: $(pwd)/$issuer/private/$hostname.key.pem" cd .. cp ca/$issuer/certs/$chain.cert.pem . cp ca/$issuer/certs/$issuer.cert.crt . cp ca/certs/$ca.cert.crt . cat > copy-cert.sh < /dev/null sudo cp ca/$issuer/private/$hostname.key.pem certs