diff --git a/deploy/apache.sh b/deploy/apache.sh index 7b34bd5f..97779367 100644 --- a/deploy/apache.sh +++ b/deploy/apache.sh @@ -1,12 +1,218 @@ #!/usr/bin/env sh - +# TESTING!!! # #Here is a script to deploy cert to apache server. #returns 0 means success, otherwise error. - +#acme.sh --install-cert -d example.com \ +#--cert-file /path/to/certfile/in/apache/cert.pem \ +#--key-file /path/to/keyfile/in/apache/key.pem \ +#--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \ +#--reloadcmd "service apache2 force-reload" ######## Public functions ##################### +set -x +# get rid of _APACHECTL, and _exec after testing +_APACHECTL='httpd' + +_exec() { + eval "$@" +} + +## $1 : new cert location $2: cp to location +_cpCert() { + #return 0 + if cp -f ${1} ${2} && chmod 600 ${2}; then + return 0 + fi + return 1 +} + +_vhostBackupConf() { + #return 0 + if cp -f "${1}" "${1}.bak"; then + return 0 + fi + return 1 +} + +_vhostRestoreConf() { + #return 0 + if cp -f "${1}.bak" "${1}"; then + return 0 + fi + return 1 +} + +_testConf() { + if ! _exec $_APACHECTL -t; then + return 1 + fi + return 0 +} + +## $1 : vhost config file to check and edit. $2: domain $3: port +_vhostConf() { + if ! _vhostBackupConf "$1"; then + # do something + testvar='' + fi + + serverName=$(awk '/ServerName/,/$/' "$1") + serverName=$(awk -F ' ' '{print $2}' <<< ${serverName}) + serverAlias=$(awk '/ServerAlias/,/$/' "$1") + serverAlias=$(awk -F ' ' '{print $2}' <<< ${serverAlias}) + docRoot=$(awk '/DocumentRoot/,/$/' "$1") + docRoot=$(awk -F ' ' '{print $2}' <<< ${docRoot}) + rootParent=$(dirname ${docRoot}) + pri=$rootParent/ssl/private + pub=$rootParent/ssl/public + mkdir -m 700 -p ${pri:1} + mkdir -m 700 -p ${pub:1} + sslEng=$(awk '/SSLEngine/,/$/' "$1") + sslEng=$(awk -F ' ' '{print $2}' <<< ${sslEng}) + sslPro=$(awk '/SSLProtocol/,/$/' "$1") + sslPro=$(awk -F ' ' '{print $2}' <<< ${sslPro}) + sslCiph=$(awk '/SSLCipherSuite/,/$/' "$1") + sslCiph=$(awk -F ' ' '{print $2}' <<< ${sslCiph}) + ciphOrd=$(awk '/SSLHonorCipherOrder/,/$/' "$1") + ciphOrd=$(awk -F ' ' '{print $2}' <<< ${ciphOrd}) + crtFile=$(awk '/SSLCertificateFile/,/$/' "$1") + crtFile=$(awk -F ' ' '{print $2}' <<< ${crtFile}) + keyFile=$(awk '/SSLCertificateKeyFile/,/$/' "$1") + keyFile=$(awk -F ' ' '{print $2}' <<< ${keyFile}) + chainFile=$(awk '/SSLCertificateChainFile/,/$/' "$1") + chainFile=$(awk -F ' ' '{print $2}' <<< ${chainFile}) + locSec1=' + RewriteEngine On + RewriteRule .* https://${matchServerName}/%{REQUEST_URI}/ [R=301,L,QSA] + +EOF +) + sed -i '/"${reWriteBlock}"/i ' "${confMatch}" + return 0 + fi + return 1 + fi + if grep -q 'SSLEngine' "$1"; then + sed -i '/SSLEngine /c\SSLEngine On' "$1" + sed -i '/SSLProtocol /c\SSLProtocol -all +TLSv1.2' "$1" + sed -i '/SSLCipherSuite /c\SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS' "$1" + sed -i '/SSLHonorCipherOrder /c\SSLHonorCipherOrder on' "$1" + sed -i '/SSLCertificateFile /c\SSLCertificateFile ${rootParent}/ssl/public/${serverName}.crt' "$1" + sed -i '/SSLCertificateChainFile /c\SSLCertificateChainFile ${rootParent}/ssl/public/${serverName}.chain.crt' "$1" + sed -i '/SSLCertificateKeyFile /c\SSLCertificateKeyFile ${rootParent}/ssl/private/${serverName}.key' "$1" + testvar='' + else + sslBlock=$(cat < + ServerName ${serverName} + DocumentRoot ${docRoot} + SSLEngine On + SSLProtocol -all +TLSv1.2 + SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS + SSLHonorCipherOrder on + SSLCertificateFile ${rootParent}/ssl/public/${serverName}.crt + SSLCertificateChainFile ${rootParent}/ssl/public/${serverName}.chain.crt + SSLCertificateKeyFile ${rootParent}/ssl/private/${serverName}.key + + ${locSec} + DirectorySlash On + + +EOF +) + echo "${sslBlock}" >> "$1" + fi + + #look for a location section eg. + + if grep -q ${locSec} "$1"; then + if grep -q ${dirSlash} "$1"; then + #set dir slash on + sed -i '/DirectorySlash /c\DirectorySlash On' "$1" + testvar='' + else + #append dir slash here + sed -i '/${locSec}/a DirectorySlash On' "$1" + testvar='' + fi + else + locBlock=$(cat < +EOF +) + # insert the new block here... + sed -i '/<\/virtualhost>/i ${locBlock}' "$1" + fi + + #look for mod_rewrite section + modReWrite='' + if grep -q ${modReWrite} "$1"; then + if grep -q "RewriteEngine On" "$1"; then + #set rewrite rules for ssl + # too many ways to redirect ssl for me to check.... + testvar='' + else + #append rewrite rules for ssl + sed -i '/${modReWrite}/a RewriteEngine On' "$1" + sed -i '/RewriteEngine On/a RewriteCond %{HTTPS} !on [OR]' "$1" + sed -i '/RewriteCond %{HTTPS} !on [OR]/a RewriteCond %{HTTP_HOST} ^www\. [NC] [OR]' "$1" + sed -i '/RewriteCond %{HTTP_HOST} ^www\. [NC] [OR]/a RewriteCond %{REQUEST_URI} !(.*)/$' "$1" + sed -i '/RewriteCond %{REQUEST_URI} !(.*)/$/a ${newRwRuleSsl}' "$1" + testvar='' + fi + else + reWriteBlock=$(cat < + RewriteEngine On + RewriteCond %{HTTPS} !on [OR] + RewriteCond %{HTTP_HOST} ^www\. [NC] [OR] + RewriteCond %{REQUEST_URI} !(.*)/$ + ${newRwRuleSsl} + +EOF +) + # insert the new block here... + sed -i '/<\/virtualhost>/i ${reWriteBlock}' "$1" + fi + return +} + -#domain keyfile certfile cafile fullchain apache_deploy() { _cdomain="$1" _ckey="$2" @@ -14,13 +220,39 @@ apache_deploy() { _cca="$4" _cfullchain="$5" - _debug _cdomain "$_cdomain" - _debug _ckey "$_ckey" - _debug _ccert "$_ccert" - _debug _cca "$_cca" - _debug _cfullchain "$_cfullchain" + all_hosts=$(eval "$_APACHECTL -S" | awk '/namevhost/,/\)/') + #echo "$all_hosts" + oldIFS=$IFS + IFS=' +' + loopLog='' + for h in $all_hosts; do + d=$(awk -F ' ' '{print $4}' <<< "${h}") + c=$(awk -F ' ' '{print $5}' <<< "${h}") + c=$(echo "$c" | awk -v FS="(\\\\(|\\\\:)" '{print $2}') + p=$(awk -F ' ' '{print $2}' <<< "${h}") + #echo "$d $p $c" + if echo ${d} | grep -q ${_cdomain}; then + if _vhostConf "$c" "$d" "$p"; then + c1='/ssl/public/' + c2='/ssl/private/' + k='.key' + k1=$rootParent$c2$d$k + c3='.crt' + c4='.chain.crt' + c5=$rootParent$c1$d$c3 + c6=$rootParent$c1$d$c4 + cp -f $_ckey ${k1:1} + cp -f $_ccert ${c5:1} + cp -f $_cfullchain ${c6:1} - _err "Deploy cert to apache server, Not implemented yet" - return 1 + fi + fi + done + IFS=$oldIFS } + +apache_deploy idragonfly.net /path/to/test.key /path/to/test.crt /path/to/test.cacert.crt /path/to/test.chain.crt +#echo "$testLog" >> test.log +set +x