1
0
mirror of https://github.com/serghey-rodin/vesta.git synced 2025-03-11 20:26:30 -07:00
vesta/bin/v-generate-ssl-cert

160 lines
3.9 KiB
Plaintext
Raw Permalink Normal View History

2014-01-21 02:03:37 +02:00
#!/bin/bash
# info: generate self signed certificate and CSR request
2016-06-09 17:07:15 +03:00
# options: DOMAIN EMAIL COUNTRY STATE CITY ORG UNIT [ALIASES] [FORMAT]
2014-01-21 02:03:37 +02:00
#
# The function generates self signed SSL certificate and CSR request
#----------------------------------------------------------#
# Variable&Function #
#----------------------------------------------------------#
2015-11-06 17:38:58 +02:00
# Argument definition
2014-01-21 02:03:37 +02:00
domain=$1
2016-06-09 17:07:15 +03:00
domain=$(echo $domain |sed -e 's/\.*$//g' -e 's/^\.*//g')
2015-05-29 01:51:58 +03:00
domain_alias=$domain
2014-01-21 02:03:37 +02:00
email=$2
country=$3
state=$4
city=$5
org=$6
org_unit=$7
2016-06-09 17:07:15 +03:00
aliases=$8
format=${9-shell}
KEY_SIZE=4096
2014-01-21 02:03:37 +02:00
DAYS=365
# Includes
source $VESTA/func/main.sh
source $VESTA/conf/vesta.conf
# Json function
json_list_ssl() {
i='1' # iterator
echo '{'
echo -e "\t\"$domain\": {"
echo " \"CRT\": \"$crt\","
echo " \"KEY\": \"$key\","
2016-06-09 17:07:15 +03:00
echo " \"CSR\": \"$csr\","
echo " \"DIR\": \"$workdir\""
2014-01-21 02:03:37 +02:00
echo -e "\t}\n}"
}
# Shell function
shell_list_ssl() {
if [ ! -z "$crt" ]; then
echo -e "$crt"
fi
if [ ! -z "$key" ]; then
echo -e "\n$key"
fi
if [ ! -z "$csr" ]; then
echo -e "\n$csr"
fi
2016-06-09 17:07:15 +03:00
echo -e "\nDirectory: $workdir"
2014-01-21 02:03:37 +02:00
}
2017-12-04 19:34:34 +02:00
# Additional argument formatting
format_domain_idn
if [[ "$email" = *[![:ascii:]]* ]]; then
email=$(idn -t --quiet -a $email)
fi
2014-01-21 02:03:37 +02:00
2016-06-09 17:07:15 +03:00
2014-01-21 02:03:37 +02:00
#----------------------------------------------------------#
# Verifications #
#----------------------------------------------------------#
2016-06-09 17:07:15 +03:00
args_usage='DOMAIN EMAIL COUNTRY STATE CITY ORG UNIT [ALIASES] [FORMAT]'
check_args '7' "$#" "$args_usage"
2021-07-27 14:35:40 +03:00
is_format_valid 'domain' 'alias' 'format'
2014-01-21 02:03:37 +02:00
#----------------------------------------------------------#
# Action #
#----------------------------------------------------------#
# Create temporary work directory
workdir=$(mktemp -d)
cd $workdir
# Generate private key
2016-06-09 17:07:15 +03:00
openssl genrsa $KEY_SIZE > $domain.key 2>/dev/null
2014-01-21 02:03:37 +02:00
# Generate the CSR
subj="/C=$country/ST=$state/localityName=$city/O=$org"
subj="$subj/organizationalUnitName=$org_unit/commonName=$domain_idn"
2014-01-21 02:03:37 +02:00
subj="$subj/emailAddress=$email"
2016-06-09 17:07:15 +03:00
if [ -z "$aliases" ]; then
openssl req -sha256\
-new \
-batch \
-subj "$subj" \
-key $domain.key \
-out $domain.csr #>/dev/null 2>&1
2016-06-09 17:07:15 +03:00
else
for alias in $(echo $domain,$aliases |tr ',' '\n' |sort -u); do
2017-12-04 19:34:34 +02:00
if [[ "$alias" = *[![:ascii:]]* ]]; then
alias=$(idn -t --quiet -a $alias)
fi
2016-06-09 17:07:15 +03:00
dns_aliases="${dns_aliases}DNS:$alias,"
done
dns_aliases=$(echo $dns_aliases |sed "s/,$//")
if [ -e "/etc/ssl/openssl.cnf" ]; then
ssl_conf='/etc/ssl/openssl.cnf'
else
ssl_conf="/etc/pki/tls/openssl.cnf"
fi
2014-01-21 02:03:37 +02:00
2016-06-09 17:07:15 +03:00
openssl req -sha256\
-new \
-batch \
-subj "$subj" \
-key $domain.key \
-reqexts SAN \
-config <(cat $ssl_conf \
<(printf "[SAN]\nsubjectAltName=$dns_aliases")) \
-out $domain.csr >/dev/null 2>&1
fi
2014-01-21 02:03:37 +02:00
# Generate the cert 1 year
2014-12-02 20:50:26 +02:00
openssl x509 -req -sha256 \
2014-01-21 02:03:37 +02:00
-days $DAYS \
-in $domain.csr \
-signkey $domain.key \
-out $domain.crt >/dev/null 2>&1
2014-01-21 02:03:37 +02:00
# Listing certificates
if [ -e "$domain.crt" ]; then
2017-12-04 19:34:34 +02:00
crt=$(cat $domain.crt |sed ':a;N;$!ba;s/\n/\\n/g' )
2014-01-21 02:03:37 +02:00
fi
if [ -e "$domain.key" ]; then
2017-12-04 19:34:34 +02:00
key=$(cat $domain.key |sed ':a;N;$!ba;s/\n/\\n/g' )
2014-01-21 02:03:37 +02:00
fi
if [ -e "$domain.csr" ]; then
2017-12-04 19:34:34 +02:00
csr=$(cat $domain.csr |sed ':a;N;$!ba;s/\n/\\n/g' )
2014-01-21 02:03:37 +02:00
fi
case $format in
json) json_list_ssl ;;
plain) nohead=1; shell_list_ssl ;;
shell) shell_list_ssl ;;
*) check_args '1' '0' '[FORMAT]'
esac
# Delete tmp dir
2016-06-09 17:07:15 +03:00
#rm -rf $workdir
2014-01-21 02:03:37 +02:00
#----------------------------------------------------------#
# Vesta #
#----------------------------------------------------------#
# Logging
2016-06-09 17:07:15 +03:00
log_event "$OK" "$ARGUMENTS"
2014-01-21 02:03:37 +02:00
exit