create_ca.sh 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. #!/usr/bin/env bash
  2. #set -x
  3. #set -euf
  4. echo "Creating ekcert for $1 => $3"
  5. echo "Creating ekcert for $2 => $4"
  6. ROOTCRT=$6.crt
  7. ROOTCRTPEM=$6.pem
  8. INTERMEDCRT=$5.crt
  9. ROOTCRL=$6.crl
  10. INTERMEDCRL=$5.crl
  11. OS=$(uname)
  12. DATE_FMT_BEFORE=""
  13. DATE_FMT_AFTER=""
  14. SED_CMD=""
  15. if [ "$OS" == "Linux" ]; then
  16. DATE_FMT_BEFORE="+%y%m%d000000Z -u -d -1day"
  17. DATE_FMT_AFTER="+%y%m%d000000Z -u -d +10years+1day"
  18. SED_CMD="sed -i"
  19. elif [ "$OS" == "FreeBSD" ]; then
  20. DATE_FMT_BEFORE="-u -v-1d +%y%m%d000000Z"
  21. DATE_FMT_AFTER="-u -v+10y +%y%m%d000000Z"
  22. SED_CMD="sed -i '' -e"
  23. fi
  24. EKCADIR="$(dirname $(realpath ${0}))/"
  25. CA_DIR="$(mktemp -d ekca-XXXXXX)"
  26. pushd "$CA_DIR"
  27. mkdir root-ca
  28. pushd root-ca
  29. mkdir certreqs certs crl newcerts private
  30. touch root-ca.index
  31. echo 00 > root-ca.crlnum
  32. echo 1000 > root-ca.serial
  33. echo "123456" > pass.txt
  34. cp "${EKCADIR}/root-ca.cnf" ./
  35. export OPENSSL_CONF=./root-ca.cnf
  36. ROOT_URL="file:$ROOTCRT"
  37. ${SED_CMD} "s|ROOTCRT|$ROOT_URL|g" $OPENSSL_CONF
  38. ROOT_URL="file:$ROOTCRL"
  39. ${SED_CMD} "s|ROOTCRL|$ROOT_URL|g" $OPENSSL_CONF
  40. openssl req -new -out root-ca.req.pem -passout file:pass.txt
  41. #
  42. # Create self signed root certificate
  43. #
  44. openssl ca -selfsign \
  45. -in root-ca.req.pem \
  46. -out root-ca.cert.pem \
  47. -extensions root-ca_ext \
  48. -startdate `date ${DATE_FMT_BEFORE}` \
  49. -enddate `date ${DATE_FMT_AFTER}` \
  50. -passin file:pass.txt -batch
  51. openssl x509 -outform der -in root-ca.cert.pem -out root-ca.cert.crt
  52. openssl verify -verbose -CAfile root-ca.cert.pem \
  53. root-ca.cert.pem
  54. openssl ca -gencrl -cert root-ca.cert.pem \
  55. -out root-ca.cert.crl.pem -passin file:pass.txt
  56. openssl crl -in root-ca.cert.crl.pem -outform DER -out root-ca.cert.crl
  57. popd #root-ca
  58. #
  59. # Create intermediate certificate
  60. #
  61. mkdir intermed-ca
  62. pushd intermed-ca
  63. mkdir certreqs certs crl newcerts private
  64. touch intermed-ca.index
  65. echo 00 > intermed-ca.crlnum
  66. echo 2000 > intermed-ca.serial
  67. echo "abcdef" > pass.txt
  68. cp "${EKCADIR}/intermed-ca.cnf" ./
  69. export OPENSSL_CONF=./intermed-ca.cnf
  70. # Adapt CRT URL to current test directory
  71. ${SED_CMD} "s|ROOTCRT|$ROOT_URL|g" $OPENSSL_CONF
  72. openssl req -new -out intermed-ca.req.pem -passout file:pass.txt
  73. openssl rsa -inform PEM -in private/intermed-ca.key.pem \
  74. -outform DER -out private/intermed-ca.key.der -passin file:pass.txt
  75. cp intermed-ca.req.pem \
  76. ../root-ca/certreqs/
  77. INTERMED_URL="file:$INTERMEDCRT"
  78. ${SED_CMD} "s|INTERMEDCRT|$INTERMED_URL|g" $OPENSSL_CONF
  79. pushd ../root-ca
  80. export OPENSSL_CONF=./root-ca.cnf
  81. openssl ca \
  82. -in certreqs/intermed-ca.req.pem \
  83. -out certs/intermed-ca.cert.pem \
  84. -extensions intermed-ca_ext \
  85. -startdate `date ${DATE_FMT_BEFORE}` \
  86. -enddate `date ${DATE_FMT_AFTER}` \
  87. -passin file:pass.txt -batch
  88. openssl x509 -outform der -in certs/intermed-ca.cert.pem \
  89. -out certs/intermed-ca.cert.crt
  90. openssl verify -verbose -CAfile root-ca.cert.pem \
  91. certs/intermed-ca.cert.pem
  92. cp certs/intermed-ca.cert.pem \
  93. ../intermed-ca
  94. cp certs/intermed-ca.cert.crt \
  95. ../intermed-ca
  96. popd #root-ca
  97. export OPENSSL_CONF=./intermed-ca.cnf
  98. openssl ca -gencrl -cert ../root-ca/certs/intermed-ca.cert.pem \
  99. -out intermed-ca.crl.pem -passin file:pass.txt
  100. openssl crl -in intermed-ca.crl.pem -outform DER -out intermed-ca.crl
  101. popd #intermed-ca
  102. #
  103. # Create RSA EK certificate
  104. #
  105. mkdir ek
  106. pushd ek
  107. cp "${EKCADIR}/ek.cnf" ./
  108. export OPENSSL_CONF=ek.cnf
  109. echo "abc123" > pass.txt
  110. # Adapt CRT and CRL URL to current test directory
  111. INTERMED_URL="file:$INTERMEDCRT"
  112. ${SED_CMD} "s|INTERMEDCRT|$INTERMED_URL|g" $OPENSSL_CONF
  113. INTERMED_URL="file:$INTERMEDCRL"
  114. ${SED_CMD} "s|INTERMEDCRL|$INTERMED_URL|g" $OPENSSL_CONF
  115. cp "$1" ../intermed-ca/certreqs/ek.pub.pem
  116. openssl req -new -nodes -newkey rsa:2048 -passin file:pass.txt -out ../intermed-ca/certreqs/nonsense.csr.pem
  117. pushd ../intermed-ca
  118. export OPENSSL_CONF=./intermed-ca.cnf
  119. openssl x509 -req -in certreqs/nonsense.csr.pem -force_pubkey certreqs/ek.pub.pem -out certs/ek.cert.der \
  120. -outform DER -extfile ../ek/ek.cnf -extensions ek_ext -set_serial 12345 \
  121. -CA intermed-ca.cert.pem -CAkey private/intermed-ca.key.pem -passin file:pass.txt
  122. cp certs/ek.cert.der ../ek
  123. popd #intermed-ca
  124. popd #EK
  125. #
  126. # Create ECC EK Certificate
  127. #
  128. mkdir ekecc
  129. pushd ekecc
  130. cp "${EKCADIR}/ek.cnf" ./
  131. export OPENSSL_CONF=ek.cnf
  132. echo "abc123" > pass.txt
  133. # Adapt CRT and CRL URL to current test directory
  134. INTERMED_URL="file:$INTERMEDCRT"
  135. ${SED_CMD} "s|INTERMEDCRT|$INTERMED_URL|g" $OPENSSL_CONF
  136. INTERMED_URL="file:$INTERMEDCRL"
  137. ${SED_CMD} "s|INTERMEDCRL|$INTERMED_URL|g" $OPENSSL_CONF
  138. cp "$2" ../intermed-ca/certreqs/ekecc.pub.pem
  139. openssl req -new -nodes -newkey rsa:2048 -passin file:pass.txt -out ../intermed-ca/certreqs/nonsense.csr.pem
  140. pushd ../intermed-ca
  141. export OPENSSL_CONF=./intermed-ca.cnf
  142. openssl x509 -req -in certreqs/nonsense.csr.pem -force_pubkey certreqs/ekecc.pub.pem -out certs/ekecc.cert.der \
  143. -outform DER -extfile ../ek/ek.cnf -extensions ek_ext -set_serial 12345 \
  144. -CA intermed-ca.cert.pem -CAkey private/intermed-ca.key.pem -passin file:pass.txt
  145. cp certs/ekecc.cert.der ../ekecc
  146. popd #intermed-ca
  147. popd #EK
  148. popd #CA_DIR
  149. # Copy used CRL and CRT files to test directory.
  150. cp "${CA_DIR}/ek/ek.cert.der" "$3"
  151. cp "${CA_DIR}/ekecc/ekecc.cert.der" "$4"
  152. cp "${CA_DIR}/intermed-ca/intermed-ca.cert.crt" "$INTERMEDCRT"
  153. cp "${CA_DIR}/intermed-ca/intermed-ca.crl" "$INTERMEDCRL"
  154. cp "${CA_DIR}/root-ca/root-ca.cert.crt" "$ROOTCRT"
  155. cp "${CA_DIR}/root-ca/root-ca.cert.crl" "$ROOTCRL"
  156. cp "${CA_DIR}/root-ca/root-ca.cert.pem" "$ROOTCRTPEM"
  157. rm -rf $CA_DIR