#!/bin/bash # Author by JKO Email: jonathan@kosar.email # This script tool enables DHEC for SSL on Nginx. # A user can also add a more hardened SSL cipher suite. # Otherwise a default 2048 EC key is generated and added to nginx-ssl.conf. # No suite or protocols are changed. Only in hardened mode they are changed. # But only clients that support the suites will be able to connect, please remember that. # http://www.roushtech.net/2014/04/01/100-qualys-ssl-test-a/ # See usage command for more. # Sidenote: -h -b 2048 will produce a hardened settings with 2048 bit key. source /etc/mailinabox.conf # load global vars source setup/functions.sh #functions apt_install openssl nginx_ssl_conf=/etc/nginx/nginx-ssl.conf DEFAULT_BIT_SIZE=2048 isHardened="false" hardened_ciphers="'ECDH+AESGCM256:DH+AESGCM256:ECDH+AES256:SH+AES256:RSA+AESGCM256:RSA+AES256:!aNULL:!MD5:!kEDH';" hardened_protocol="TLSv1.2;" DHEC_path=$STORAGE_ROOT/ssl/dhparam.pem # Functions update_config() { lineNUM=$(grep -n "$2" $1 | tail -n1 | sed 's/:.*//') [ "$lineNUM" ] || lineNUM="$" sed -i -r "$lineNUM s|#?(.*)|#\1\n$4\n$2 $3|" "$1" } ok() { echo -e '\e[32m'$1'\e[m'; } # Usage info usage() { cat << EOF Usage: ${0##*/} [-h] [-b BIT_SIZE] [-p DIR_DHEC_KEY] [-c DIR_NGINX_SSL] This script generates and enables DHEC for Nginx. Defaulted to 2048 key. Hardened mode will generate 4096 key and the following cipher suites: 'ECDH+AESGCM256:DH+AESGCM256:ECDH+AES256:SH+AES256:RSA+AESGCM256:RSA+AES256:!aNULL:!MD5:!kEDH' -h Enable hardened ciphers and 4096 bit key. -b Specify the bit size to generate which will override any other default. -p Specify dir to generate the DHEC key. -c Specify dir nginx ssl conf is. EOF exit 1 } while getopts "hb:c:p:" opt ; do case "${opt}" in b) BIT_SIZE=${OPTARG} if [ -z "${OPTARG}" ]; then usage fi ;; h) isHardened=true BIT_SIZE=4096 ;; p) DHEC_path=${OPTARG} if [ -z "${OPTARG}" ]; then usage fi ;; c) nginx_ssl_conf=${OPTARG} if [ -z "${OPTARG}" ]; then usage fi ;; *) usage ;; esac done shift $((OPTIND-1)) if [ -z "${BIT_SIZE}" -a "true" == ${isHardened} ]; then BIT_SIZE=4096 elif [ -z "${BIT_SIZE}" ]; then BIT_SIZE=$DEFAULT_BIT_SIZE fi ok "❯❯❯ It might take a while, grab a coffee!" if [ ! -f $DHEC_path ]; then # Generate a 4096 bit random parameter for DH elliptic curves. # Generated by OpenSSL with the following command: # openssl dhparam -outform pem -out dhparam.pem 2048 # openssl dhparam -outform pem -out dhparam.pem 4096 openssl dhparam -outform pem -out $DHEC_path $BIT_SIZE fi update_config $nginx_ssl_conf ssl_dhparam $DHEC_path';' "#Path to DHEC key" if [ $isHardened == "true" ]; then update_config $nginx_ssl_conf ssl_ciphers $hardened_ciphers "#Hardened SSL Ciphers DHEC" update_config $nginx_ssl_conf ssl_protocols $hardened_protocol "#Hardened SSL Protocol" fi service nginx reload