v-generate-ssl-cert 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #!/bin/bash
  2. # info: generate self signed certificate and CSR request
  3. # options: DOMAIN EMAIL COUNTRY STATE CITY ORG UNIT [ALIASES] [FORMAT]
  4. #
  5. # The function generates self signed SSL certificate and CSR request
  6. #----------------------------------------------------------#
  7. # Variable&Function #
  8. #----------------------------------------------------------#
  9. # Argument definition
  10. domain=$1
  11. domain=$(echo $domain |sed -e 's/\.*$//g' -e 's/^\.*//g')
  12. domain_alias=$domain
  13. email=$2
  14. country=$3
  15. state=$4
  16. city=$5
  17. org=$6
  18. org_unit=$7
  19. aliases=$8
  20. format=${9-shell}
  21. KEY_SIZE=4096
  22. DAYS=365
  23. # Includes
  24. source $VESTA/func/main.sh
  25. source $VESTA/conf/vesta.conf
  26. # Json function
  27. json_list_ssl() {
  28. i='1' # iterator
  29. echo '{'
  30. echo -e "\t\"$domain\": {"
  31. echo " \"CRT\": \"$crt\","
  32. echo " \"KEY\": \"$key\","
  33. echo " \"CSR\": \"$csr\","
  34. echo " \"DIR\": \"$workdir\""
  35. echo -e "\t}\n}"
  36. }
  37. # Shell function
  38. shell_list_ssl() {
  39. if [ ! -z "$crt" ]; then
  40. echo -e "$crt"
  41. fi
  42. if [ ! -z "$key" ]; then
  43. echo -e "\n$key"
  44. fi
  45. if [ ! -z "$csr" ]; then
  46. echo -e "\n$csr"
  47. fi
  48. echo -e "\nDirectory: $workdir"
  49. }
  50. #----------------------------------------------------------#
  51. # Verifications #
  52. #----------------------------------------------------------#
  53. args_usage='DOMAIN EMAIL COUNTRY STATE CITY ORG UNIT [ALIASES] [FORMAT]'
  54. check_args '7' "$#" "$args_usage"
  55. is_format_valid 'domain_alias' 'format'
  56. #----------------------------------------------------------#
  57. # Action #
  58. #----------------------------------------------------------#
  59. if [[ "$domain" = *[![:ascii:]]* ]]; then
  60. domain_idn=$(idn -t --quiet -a $domain)
  61. else
  62. domain_idn=$domain
  63. fi
  64. if [[ "$email" = *[![:ascii:]]* ]]; then
  65. email=$(idn -t --quiet -a $email)
  66. fi
  67. # Create temporary work directory
  68. workdir=$(mktemp -d)
  69. cd $workdir
  70. # Generate private key
  71. openssl genrsa $KEY_SIZE > $domain.key 2>/dev/null
  72. # Generate the CSR
  73. subj="/C=$country/ST=$state/localityName=$city/O=$org"
  74. subj="$subj/organizationalUnitName=$org_unit/commonName=$domain_idn"
  75. subj="$subj/emailAddress=$email"
  76. if [ -z "$aliases" ]; then
  77. openssl req -sha256\
  78. -new \
  79. -batch \
  80. -subj "$subj" \
  81. -key $domain.key \
  82. -out $domain.csr #>/dev/null 2>&1
  83. else
  84. for alias in $(echo $domain,$aliases |tr ',' '\n' |sort -u); do
  85. dns_aliases="${dns_aliases}DNS:$alias,"
  86. done
  87. dns_aliases=$(echo $dns_aliases |sed "s/,$//")
  88. if [ -e "/etc/ssl/openssl.cnf" ]; then
  89. ssl_conf='/etc/ssl/openssl.cnf'
  90. else
  91. ssl_conf="/etc/pki/tls/openssl.cnf"
  92. fi
  93. openssl req -sha256\
  94. -new \
  95. -batch \
  96. -subj "$subj" \
  97. -key $domain.key \
  98. -reqexts SAN \
  99. -config <(cat $ssl_conf \
  100. <(printf "[SAN]\nsubjectAltName=$dns_aliases")) \
  101. -out $domain.csr >/dev/null 2>&1
  102. fi
  103. # Generate the cert 1 year
  104. openssl x509 -req -sha256 \
  105. -days $DAYS \
  106. -in $domain.csr \
  107. -signkey $domain.key \
  108. -out $domain.crt >/dev/null 2>&1
  109. # Listing certificates
  110. if [ -e "$domain.crt" ]; then
  111. crt=$(cat $domain.crt | sed ':a;N;$!ba;s/\n/\\n/g' )
  112. fi
  113. if [ -e "$domain.key" ]; then
  114. key=$(cat $domain.key | sed ':a;N;$!ba;s/\n/\\n/g' )
  115. fi
  116. if [ -e "$domain.csr" ]; then
  117. csr=$(cat $domain.csr | sed ':a;N;$!ba;s/\n/\\n/g' )
  118. fi
  119. case $format in
  120. json) json_list_ssl ;;
  121. plain) nohead=1; shell_list_ssl ;;
  122. shell) shell_list_ssl ;;
  123. *) check_args '1' '0' '[FORMAT]'
  124. esac
  125. # Delete tmp dir
  126. #rm -rf $workdir
  127. #----------------------------------------------------------#
  128. # Vesta #
  129. #----------------------------------------------------------#
  130. # Logging
  131. log_event "$OK" "$ARGUMENTS"
  132. exit