flipje

create-ssl-tool

Jan 8th, 2012
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 14.18 KB | None | 0 0
  1. #!/bin/bash
  2. # dit script is bedoeld om een certificaat aan te maken, het maakt een directory met hostname-certs
  3. # in de directory /root/certs/
  4. # flip hess 201102 [email protected]
  5.  
  6.   PATH='/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin'
  7.   SCRIPT_PATH="${0}"
  8.   TOTARG="${#}"
  9.   ARG1="${1}"
  10.   ARG2="${2}"
  11.  
  12.   # Default settings:
  13.   DIR="$HOME/certs"   # where to create certdirs
  14.   EDITOR="vim"
  15.  
  16.   SETTINGS="/var/tmp/cert-settings.$(date +"%Y%m%d")"   # create temp settings file
  17.   ORIG="/var/tmp/cert-settings.orig"            # create temp orig file
  18.   TIMESTAMP="$(date +'%Y%m%d')"             # timestamp
  19.  
  20.  
  21.   # dependencie checken:
  22.   if [ ! -x /usr/bin/openssl ]
  23.   then
  24.      echo "Bark Bark! Script went haywire!"
  25.      echo "Openssl was not found!"
  26.      exit 1
  27.   fi
  28.  
  29.   # certificaten dir maken
  30.   if [ ! -d "${DIR}" ]
  31.   then
  32.     mkdir -p "${DIR}"
  33.   fi
  34.  
  35.   # dit script werkt met timestamp data in files en mag dus niet precies een paar seconden voor 00:00 afgetrapt worden
  36.   # want dan vind hij zn files niet meer terug :)
  37.   if [ $(date +'%H%M%S') -gt 235955 ]
  38.   then
  39.      echo "waiting for day switch, please wait 10 seconds"
  40.      echo "you better go to sleep!"
  41.      sleep 10
  42.   fi
  43.  
  44.  
  45. ########################################################
  46. #
  47. #          The Functions:
  48. #
  49. ########################################################
  50.  
  51.  
  52. ########################################################
  53. # cert-help --> interactief een certificaat genereren
  54. ########################################################
  55. function fCerthelp()
  56. {
  57.   # Check if 2 args given
  58.   if [ "${TOTARG}" -ne 2 ]
  59.   then
  60.     echo "error: please provide 2 arguments"
  61.     echo "Usage: ${SCRIPT_PATH} cert-help 'hostname'"
  62.     exit 0
  63.   fi
  64.  
  65.   echo "creating settings file"
  66.  
  67.  # als de defaults aanwezig zijn, editen? als ze niet aanwezig zijn, aanmaken en editen
  68.   if [ ! -e ${ORIG} ] && [ ! -e ${SETTINGS} ]
  69.   then
  70.     fCreatesettingsCERT && fChecksettings || ( echo "setting and processing settings failed, please check your settings" ; exit 1 )
  71.  
  72.   elif [ -e ${ORIG} ] || [ -e ${SETTINGS} ]
  73.   then
  74.     echo "Existing settings file found, do you want to edit existing settingsfile? [Y/n]"
  75.     read ANSWER
  76.     if [ "${ANSWER}" != 'n' ] && [ "${ANSWER}" != 'N' ] && [ "${ANSWER}" != 'no' ] && [ "${ANSWER}" != 'No' ] && [ "${ANSWER}" != 'NO' ]
  77.     then
  78.       fChecksettings || ( echo "setting and processing settings failed, please check your settings" ; exit 1 )
  79.     else  
  80.       echo "creating new settings file"
  81.       fCreatesettingsCERT && fChecksettings || ( echo "setting and processing settings failed, please check your settings" ; exit 1 )
  82.     fi
  83.   fi
  84.  
  85.   # check for keyfile
  86.   if [ ! -e ${KEYFILE} ]
  87.   then
  88.     echo "${KEYFILE} not found, please re-edit your settings"
  89.     exit 1
  90.   fi
  91.  
  92.   # check for csr
  93.   if [ ! -e ${CSRFILE} ]
  94.   then
  95.     echo "${CSRFILE} not found, please re-edit your settings"
  96.     exit 1
  97.   fi
  98.  
  99.   # voorkomen dat certificaten overschreven worden:
  100.   if [ -e ${CERTFILE} ]
  101.   then
  102.      echo "${CERTFILE} already exists! please rename before overwriting! "
  103.      exit 1
  104.   else
  105.     # are you sure?
  106.     echo "Creating a CERT file for ${COMMON} in ${CERTFILE}"
  107.     echo "Continue? [Y/n}"
  108.   fi
  109.   read ANSWER
  110.  
  111.   if [ "${ANSWER}" != 'n' ] && [ "${ANSWER}" != 'N' ] && [ "${ANSWER}" != 'no' ] && [ "${ANSWER}" != 'No' ] && [ "${ANSWER}" != 'NO' ]
  112.   then
  113.     # do the magic:
  114.     cd ${DIR} && openssl x509 -req -days ${AGE} -in ${CSRFILE} -signkey ${KEYFILE} -out ${CERTFILE} || ( echo "generating certificate failed!" ; exit 1 )
  115.   else
  116.     echo "generation canceled"
  117.     exit 1
  118.   fi
  119.  
  120.   echo "----------------------------------------------------------------------------------------------------------"
  121.   echo "Certificate succesfully generated"
  122.   echo
  123.   echo "cert file: ${CERTFILE}"
  124.   echo "----------------------------------------------------------------------------------------------------------"
  125.   rm ${SETTINGS} ${ORIG}
  126.  
  127.   return 0
  128. }
  129.  
  130.  
  131.  
  132.  
  133. ########################################################
  134. # csr-help --> interactief certificaat REQUEST genereren
  135. ########################################################
  136. function fCsrhelp()
  137. {
  138.  
  139.   # Check if 2 args given
  140.   if [ "${TOTARG}" -ne 2 ]
  141.   then
  142.     echo "error: please provide 2 arguments"
  143.     echo "Usage: ${SCRIPT_PATH} csr-help 'hostname'"
  144.     exit 0
  145.   fi
  146.  
  147.  # als de defaults aanwezig zijn, editen? als ze niet aanwezig zijn, aanmaken en editen
  148.   if [ ! -e ${ORIG} ] && [ ! -e ${SETTINGS} ]
  149.   then
  150.     fCreatesettingsCSR && fChecksettings  || ( echo "setting and processing settings failed, please check your settings" ; exit 1 )
  151.  
  152.   elif [ -e ${ORIG} ] || [ -e ${SETTINGS} ]
  153.   then
  154.     echo "existing settings file found, do you want to edit existing settingsfile? [Y/n]"
  155.     read ANSWER
  156.     if [ "${ANSWER}" != 'n' ] && [ "${ANSWER}" != 'N' ] && [ "${ANSWER}" != 'no' ] && [ "${ANSWER}" != 'No' ] && [ "${ANSWER}" != 'NO' ]
  157.     then
  158.       fChecksettings
  159.     else  
  160.       echo "creating a new settings file"
  161.       echo
  162.       fCreatesettingsCSR && fChecksettings  || ( echo "setting and processing settings failed, please check your settings" ; exit 1 )
  163.     fi
  164.   fi
  165.  
  166.   # are you sure?
  167.   echo "Creating a CSR and a key file for ${COMMON} in ${CSRFILE}"
  168.   echo "Continue? [Y/n]"
  169.   read ANSWER
  170.  
  171.   if [ "${ANSWER}" = 'n' ] || [ "${ANSWER}" = 'N' ] || [ "${ANSWER}" = 'no' ] || [ "${ANSWER}" = 'No' ] || [ "${ANSWER}" = 'NO' ]
  172.   then
  173.     echo "Creation was canceled."
  174.     exit 1
  175.   fi
  176.  
  177.   echo "----------------------------------------------------------------------------------------------------------"
  178.   echo "Subject is : C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORG}/OU=${OU}/CN=${COMMON}"
  179.   echo
  180.  
  181.   # do tha magic:
  182.   if [ -e ${CSRFILE} ] || [ -e ${KEYFILE} ]
  183.   then
  184.      echo "${CSRFILE} or ${KEYFILE} already exists! please rename before overwriting! "
  185.      exit 1
  186.   else
  187.     cd ${DIR} && openssl req -new -newkey rsa:${ALGSIZE} -sha1 -nodes -subj /C="${COUNTRY}"/ST="${STATE}"/L="${LOCALITY}"/O="${ORG}"/OU="${OU}"/CN="${COMMON}" -keyout ${KEYFILE} -out ${CSRFILE} || ( echo "Bark Bark, generation of ${CSRFILE} went haywire!" ; exit 1 )
  188.   fi
  189.   echo "----------------------------------------------------------------------------------------------------------"
  190.   echo "Certificate request and keyfile succesfully generated"
  191.   echo
  192.   echo "key file: ${KEYFILE}"
  193.   echo "CSR file: ${CSRFILE}"
  194.   echo "----------------------------------------------------------------------------------------------------------"
  195.  
  196.   rm ${SETTINGS} ${ORIG}
  197.  
  198.   return 0
  199. }
  200.  
  201. ########################################################
  202. # funtctie selfsigned -> genereer een csr met de default settings
  203. ########################################################
  204. function fSelfsigned()
  205. {
  206.   # Check if 2 args given
  207.   if [ "${TOTARG}" -ne 2 ]
  208.   then
  209.     echo "error: please provide 2 arguments"
  210.     echo "Usage: ${SCRIPT_PATH} selfsigned 'hostname'"
  211.     exit 0
  212.   fi
  213.  
  214.   echo "Creating self-signed certificate for ${ARG2}"
  215.   # first creating a CSR file
  216.   fCsr
  217.  
  218.   # create settings and source them
  219.   fCreatesettingsCERT && source ${SETTINGS} || ( echo "sourcing settings failed, please check your settings" ; exit 1 )
  220.  
  221.   # do tha magic:
  222.   if [ -e ${CERTFILE} ]
  223.   then
  224.      echo "${CERTFILE} already exists! please rename before overwriting! "
  225.      exit 1
  226.   else
  227.     cd ${DIR} && openssl x509 -req -days ${AGE} -in ${CSRFILE} -signkey ${KEYFILE} -out ${CERTFILE} || ( echo "Error while creating Certificate Request ${CERTFILE}" ; exit 1 )
  228.   fi
  229.  
  230.   echo "----------------------------------------------------------------------------------------------------------"
  231.   echo "Certificate for ${ARG2} succesfully created"
  232.   echo
  233.   echo "File location is ${CERTFILE}"
  234.   echo "----------------------------------------------------------------------------------------------------------"
  235.  
  236.   rm ${SETTINGS} ${ORIG}
  237.  
  238.   return 0
  239. }
  240.  
  241. ########################################################
  242. # funtctie csr -> genereer een csr met de default settings
  243. ########################################################
  244. function fCsr()
  245. {
  246.   # Check if 2 args given
  247.   if [ "${TOTARG}" -ne 2 ]
  248.   then
  249.     echo "error: please provide 2 arguments"
  250.     echo "Usage: ${SCRIPT_PATH} csr 'hostname'"
  251.     exit 0
  252.   fi
  253.  
  254.   fCreatesettingsCSR && source ${SETTINGS} || ( echo "sourcing settings failed, please check your settings" ; exit 1 )
  255.  
  256.   # are you sure?
  257.   echo "Creating a CSR and a key file for ${COMMON} in ${DIR} using default settings"
  258.   echo "Continue? [Y/n]"
  259.   read ANSWER
  260.  
  261.   if [ "${ANSWER}" = 'n' ] || [ "${ANSWER}" = 'N' ] || [ "${ANSWER}" = 'no' ] || [ "${ANSWER}" = 'No' ] || [ "${ANSWER}" = 'NO' ]
  262.   then
  263.      echo "Creation was canceled."
  264.      exit 1
  265.   fi
  266.  
  267.   # do tha magic:
  268.   if [ -e ${KEYFILE} ] || [ -e ${CSRFILE} ]
  269.   then
  270.      echo "${KEYFILE} or ${CSRFILE} already exists! please rename before overwriting! "
  271.      exit 1
  272.   else
  273.     echo "Subject is : /C=${COUNTRY}/ST=${STATE}/L=${LOCALITY}/O=${ORG}/OU=${OU}/CN=${COMMON}"
  274.     cd ${DIR} && openssl req -new -newkey rsa:${ALGSIZE} -sha1 -nodes -subj /C="${COUNTRY}"/ST="${STATE}"/L="${LOCALITY}"/O="${ORG}"/OU="${OU}"/CN="${COMMON}" -keyout ${KEYFILE} -out ${CSRFILE} || ( echo "Error while creating Certificate Request ${CSRFILE}" ; exit 1 )
  275.   fi
  276.  
  277.   echo "----------------------------------------------------------------------------------------------------------"
  278.   echo "Certificate Request ${ARG2} succesfully created"
  279.   echo
  280.   echo "location of certificate request is: ${CSRFILE}"
  281.   echo "location of certificate keyfile is: ${KEYFILE}"
  282.   echo "----------------------------------------------------------------------------------------------------------"
  283.  
  284.   rm ${SETTINGS} ${ORIG}
  285.  
  286.   return 0
  287. }
  288.  
  289.  
  290. ########################################################
  291. # create csr settings file
  292. ########################################################
  293. function fCreatesettingsCSR()
  294. {
  295.   cat <<EOF | tee ${ORIG} > ${SETTINGS}
  296.      ##########################################
  297.      # SSL CSR settings file                  #
  298.      #                                        #
  299.      # flip hess 2011 [email protected]     #
  300.      ##########################################
  301.  
  302.      # location of the csr
  303.      CSRFILE=${DIR}/${ARG2}-${TIMESTAMP}.csr  
  304.  
  305.      # location of the key file
  306.      KEYFILE=${DIR}/${ARG2}-${TIMESTAMP}.key    
  307.  
  308.      # size of the algoritm:
  309.      ALGSIZE="2048"
  310.  
  311.      # countryName for subject
  312.      COUNTRY="NL"
  313.  
  314.      # stateOrProvinceName for subject
  315.      STATE="Noord-Holland"
  316.  
  317.      # localityName for subject
  318.      LOCALITY="Amsterdam"  
  319.  
  320.      # organizationName for subject
  321.      ORG="Firma SSL bv."  
  322.  
  323.      # organizationalUnitName for subject
  324.      OU="Webserver.ou"    
  325.  
  326.      # commonName (hostname)
  327.      COMMON="${ARG2}"      
  328. EOF
  329.  
  330. return 0
  331. }
  332.  
  333.  
  334. ########################################################
  335. # create cert settings file
  336. ########################################################
  337. function fCreatesettingsCERT()
  338. {
  339.   cat <<EOF | tee ${ORIG} > ${SETTINGS}
  340.      ##########################################
  341.      # SSL CERT settings file                 #
  342.      #                                        #
  343.      # flip hess 2011 [email protected]     #
  344.      ##########################################
  345.  
  346.      # Location of the CSR file
  347.      CSRFILE="${DIR}/${ARG2}-${TIMESTAMP}.csr"
  348.  
  349.      # Location of the KEY file
  350.      KEYFILE="${DIR}/${ARG2}-${TIMESTAMP}.key"
  351.  
  352.      # where to store the CERT file
  353.      CERTFILE="${DIR}/${ARG2}-${TIMESTAMP}.crt"
  354.    
  355.      # validity duration of the certificate
  356.      AGE="99999999"
  357. EOF
  358.  
  359. return 0
  360. }
  361.  
  362.  
  363. ########################################################
  364. # check en edit setting                                #
  365. ########################################################
  366. function fChecksettings()
  367. {
  368.   echo "----------------------------------------------------------------------------------------------------------"
  369.   echo "Now opening settings file with ${EDITOR}"
  370.   echo "To change editor, set the \"\${EDITOR}\" variable"
  371.   sleep 1
  372.   ${EDITOR} ${SETTINGS}
  373.  
  374.   # check if changed and asking for input
  375.   diff ${ORIG} ${SETTINGS} > /dev/null 2>&1
  376.   if [ ${?} = 0 ]
  377.   then
  378.     DIFFS=0
  379.   else
  380.     DIFFS=1
  381.   fi
  382.  
  383.   # zo lang als DIFFS 0 is (ongewijzigd) do:
  384.   while [ ${DIFFS} = '0' ]
  385.   do
  386.     echo "No changes made to settings, do you want to re-edit the settings file? [Y/n] "
  387.     read ANSWER
  388.  
  389.     if [ "${ANSWER}" != 'n' ] && [ "${ANSWER}" != 'N' ] && [ "${ANSWER}" != 'no' ] && [ "${ANSWER}" != 'No' ] && [ "${ANSWER}" != 'NO' ]
  390.     then
  391.        ${EDITOR} ${SETTINGS}
  392.        diff ${ORIG} ${SETTINGS} > /dev/null 2>&1
  393.        if [ ${?} = 0 ]
  394.        then
  395.          DIFFS=0
  396.        else
  397.          DIFFS=1
  398.        fi
  399.     else
  400.        echo "continuing with default settings"
  401.        echo
  402.        DIFFS=1
  403.     fi
  404.   done
  405.  
  406.  # sourcing settings:
  407.  source ${SETTINGS} || ( echo "sourcing settings failed, please check your settings" ; exit 1 )
  408.  
  409.  return 0
  410.  
  411. }
  412.  
  413.  
  414.  
  415. ########################################################
  416. # Shows usage.
  417. ########################################################
  418. function fUsage()
  419. {
  420.   echo
  421.   echo "Usage: ${SCRIPT_PATH}  csr-help|crt-help|selfsigned|csr|usage"
  422.   echo
  423.   echo "csr-help               : create a custom certificate interactively"
  424.   echo "crt-help               : create a custom self signed certificate interactively"
  425.   echo
  426.   echo "csr 'hostname'         : create a certificate request for 'hostname' using the default settings"
  427.   echo "selfsigned 'hostname'  : create a certificate request for 'hostname' using the default settings"
  428.   echo
  429.   echo "usage                  : show usage information."
  430.   echo
  431.  
  432.   return 0
  433. }
  434.  
  435. ########################################################
  436. # The main function.
  437. ########################################################
  438. function fMain()
  439. {
  440.   case "${ARG1}"
  441.   in
  442.     csr-help)
  443.       fCsrhelp
  444.       ;;
  445.     cert-help)
  446.       fCerthelp
  447.       ;;
  448.     selfsigned)
  449.       fSelfsigned
  450.       ;;
  451.     csr)
  452.       fCsr
  453.       ;;
  454.     usage)
  455.       fUsage
  456.       ;;
  457.     *)
  458.       fUsage
  459.       ;;
  460.   esac
  461.  
  462.   return 0
  463. }
  464.  
  465.  
  466. # Start the program:
  467.  
  468. fMain "${@}"
  469.  
  470. # Exit with previous return code:
  471. exit "${?}"
Advertisement
Add Comment
Please, Sign In to add comment